在 x 轴上绘制带有垂直标签的图形 Matplotlib
Plot graph with vertical labels on the x-axis Matplotlib
为了继续研究如何绘制 xml 文件并继续检查我的代码,我首先对 signal.attrib ["Value"]
应用了除法,因为它显示了一些字符串值和我'我感兴趣的是数值。
正如您在下面看到的,我依赖于 Pandas and SQL Compare 的文档。
import xml.etree.ElementTree as ET
import pandas as pd
from matplotlib import pyplot as plot
def transformData (rootXML):
print ("File:", rootXML)
file_xml = ET.parse (rootXML)
data_XML = [
{"Name": signal.attrib ["Name"],
# "Value": signal.attrib ["Value"]
"Value": int (signal.attrib ["Value"].split(' ')[0])
} for the signal in file_xml.findall (".//Signal")
]
signals_df = pd.DataFrame (XML_data)
signals_df [(signals_df ["Name"] == 'Status') |
(signals_df ["Name"] == 'Lock_Stat')]. plot (kind = 'line', rot = 0)
plot.title ('Changing signals every time they occur')
plot.xlabel ('Signal name')
plot.ylabel ('Signal value')
plot.show ()
plot.clf ()
plot.close ()
我 运行 它有一个完整的 xml 文件,其中有很多信号,比如 this link 中的信号:(我把它放在这里是因为它不允许我由于 xml)
的长度,附上代码
因此,一旦我编译了所有数据,我就 运行 图表,结果如下(并非所有标签都在文件中):
实际上我必须使用的是 this page 底部附近的“开关点跟踪”图。但现在我正在研究它,它以线条图的形式为我服务。
但是如何在 x 轴上将其除以标签名称 ('Name') 而不是数字 0、20、40 等,即如何使所有名称出现在图表上并垂直放置?是否有可能做到这一点?或者我不知道... Matplotlib 可以将标签转换为数字,然后在图表旁边的标签旁边绘制数字的描述以使图表更易于理解吗?
是的,你可以,使用 xticks()。
# Your labels list
labels = [chr(x) for x in range(65, 91)]
# > ["A", "B", "C" ..., "Z"] as an example
import numpy as np
data = np.random.rand(26, 1) # random data to illustrate
import matplotlib.pyplot as plt
plt.xticks(ticks=range(len(data)), labels=labels, rotation=90)
plt.plot(data) # Your data
plt.show()
请注意,在大多数情况下,当您想使情节更精彩时,您会希望更精确地操纵人物和斧头并使用更多可用参数。
fig, ax = plt.subplots()
ax.set_xticks(range(len(data)))
ax.set_xticklabels(labels, rotation=90)
ax.plot(data)
plt.show()
# Same result
pandas 中的线图默认使用 DataFrame 或 Series 索引。考虑在绘图之前将索引设置为 Name
。此外,使用 Series.isin
进行所需的多个值过滤:
names_list = [
'Status', 'SetDSP', 'HMI', 'Delay', 'AutoConfigO_Rear', 'AutoConfigO_Front',
'AutoConfigO_Drvr', 'AutoConfigO_Allst', 'RUResReqstStat', 'RUReqstrSystem',
'RUSource', 'DSP', 'CurrTUBand', 'DrStatDrv', 'PW_Chim', 'BtnID', 'Cod_BtnID',
'SetVol', 'Lock_Stat'
]
(signals_df[signals_df["Name"].isin(names_list)]
.set_index("Name")
.plot(kind="line", rot=0)
)
(signals_df.query("Name == @names_list")
.set_index("Name")
.plot(kind="line", rot=0)
)
或者,使用 pandas.DataFrame.plot
的 x
参数:
(signals_df[signals_df["Name"].isin(names_list)]
.plot(kind="line", x="Name", rot=0)
)
但是,如果 Name
在数据中重复多次,set_index
可能会引发错误并且 x
参数可能会 return 不希望的结果。因此,与您之前的 post 一样,考虑 运行 groupby
为每个唯一 Name 聚合 Value。低于每个名称的平均值:
signals_df.groupby(["Name"])["Value"].mean().plot(kind="line", rot=0)
为了继续研究如何绘制 xml 文件并继续检查我的代码,我首先对 signal.attrib ["Value"]
应用了除法,因为它显示了一些字符串值和我'我感兴趣的是数值。
正如您在下面看到的,我依赖于 Pandas and SQL Compare 的文档。
import xml.etree.ElementTree as ET
import pandas as pd
from matplotlib import pyplot as plot
def transformData (rootXML):
print ("File:", rootXML)
file_xml = ET.parse (rootXML)
data_XML = [
{"Name": signal.attrib ["Name"],
# "Value": signal.attrib ["Value"]
"Value": int (signal.attrib ["Value"].split(' ')[0])
} for the signal in file_xml.findall (".//Signal")
]
signals_df = pd.DataFrame (XML_data)
signals_df [(signals_df ["Name"] == 'Status') |
(signals_df ["Name"] == 'Lock_Stat')]. plot (kind = 'line', rot = 0)
plot.title ('Changing signals every time they occur')
plot.xlabel ('Signal name')
plot.ylabel ('Signal value')
plot.show ()
plot.clf ()
plot.close ()
我 运行 它有一个完整的 xml 文件,其中有很多信号,比如 this link 中的信号:(我把它放在这里是因为它不允许我由于 xml)
的长度,附上代码因此,一旦我编译了所有数据,我就 运行 图表,结果如下(并非所有标签都在文件中):
实际上我必须使用的是 this page 底部附近的“开关点跟踪”图。但现在我正在研究它,它以线条图的形式为我服务。
但是如何在 x 轴上将其除以标签名称 ('Name') 而不是数字 0、20、40 等,即如何使所有名称出现在图表上并垂直放置?是否有可能做到这一点?或者我不知道... Matplotlib 可以将标签转换为数字,然后在图表旁边的标签旁边绘制数字的描述以使图表更易于理解吗?
是的,你可以,使用 xticks()。
# Your labels list
labels = [chr(x) for x in range(65, 91)]
# > ["A", "B", "C" ..., "Z"] as an example
import numpy as np
data = np.random.rand(26, 1) # random data to illustrate
import matplotlib.pyplot as plt
plt.xticks(ticks=range(len(data)), labels=labels, rotation=90)
plt.plot(data) # Your data
plt.show()
请注意,在大多数情况下,当您想使情节更精彩时,您会希望更精确地操纵人物和斧头并使用更多可用参数。
fig, ax = plt.subplots()
ax.set_xticks(range(len(data)))
ax.set_xticklabels(labels, rotation=90)
ax.plot(data)
plt.show()
# Same result
pandas 中的线图默认使用 DataFrame 或 Series 索引。考虑在绘图之前将索引设置为 Name
。此外,使用 Series.isin
进行所需的多个值过滤:
names_list = [
'Status', 'SetDSP', 'HMI', 'Delay', 'AutoConfigO_Rear', 'AutoConfigO_Front',
'AutoConfigO_Drvr', 'AutoConfigO_Allst', 'RUResReqstStat', 'RUReqstrSystem',
'RUSource', 'DSP', 'CurrTUBand', 'DrStatDrv', 'PW_Chim', 'BtnID', 'Cod_BtnID',
'SetVol', 'Lock_Stat'
]
(signals_df[signals_df["Name"].isin(names_list)]
.set_index("Name")
.plot(kind="line", rot=0)
)
(signals_df.query("Name == @names_list")
.set_index("Name")
.plot(kind="line", rot=0)
)
或者,使用 pandas.DataFrame.plot
的 x
参数:
(signals_df[signals_df["Name"].isin(names_list)]
.plot(kind="line", x="Name", rot=0)
)
但是,如果 Name
在数据中重复多次,set_index
可能会引发错误并且 x
参数可能会 return 不希望的结果。因此,与您之前的 post 一样,考虑 运行 groupby
为每个唯一 Name 聚合 Value。低于每个名称的平均值:
signals_df.groupby(["Name"])["Value"].mean().plot(kind="line", rot=0)