在 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)
)

DataFrame.query:

(signals_df.query("Name == @names_list")
           .set_index("Name")
           .plot(kind="line", rot=0)
)

或者,使用 pandas.DataFrame.plotx 参数:

(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)