Matplotlib绘制XML信号数据如何设置x轴为垂直显示的名称标签
方案1:直接替换x轴标签为Name字段并垂直显示
你当前绘图默认使用DataFrame的行索引作为x轴刻度,所以显示为数字,只需要修改绘图部分的代码,手动指定x轴的刻度和标签即可,修改后的代码如下:
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": int (signal.attrib ["Value"].split(' ')[0]) # 修正原代码列表生成式多写的the关键词 } for signal in file_xml.findall (".//Signal") ] # 修正原代码变量名错误,XML_data改为定义的data_XML signals_df = pd.DataFrame (data_XML) target_df = signals_df[(signals_df ["Name"] == 'Status') | (signals_df ["Name"] == 'Lock_Stat')].reset_index(drop=True) ax = target_df.plot(kind = 'line', y='Value', rot = 0) # 设置x轴刻度位置为所有行的索引,标签对应每行的Name字段,旋转90度垂直显示 ax.set_xticks(target_df.index) ax.set_xticklabels(target_df['Name'], rotation=90) plot.title ('信号触发时的数值变化') plot.xlabel ('信号名称') plot.ylabel ('信号数值') # 自动调整布局,避免底部标签被截断 plot.tight_layout() plot.show () plot.clf () plot.close ()
数据量不大、标签数量不多的情况下该方案可直接生效。
方案2:标签数字映射+侧边说明
如果标签数量太多,垂直显示依然拥挤看不清,可以用数字映射的方案,代码修改如下:
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": int (signal.attrib ["Value"].split(' ')[0]) } for signal in file_xml.findall (".//Signal") ] signals_df = pd.DataFrame (data_XML) target_df = signals_df[(signals_df ["Name"] == 'Status') | (signals_df ["Name"] == 'Lock_Stat')].reset_index(drop=True) # 生成唯一名称到数字的映射 unique_names = target_df['Name'].unique() name_code_map = {name:idx+1 for idx, name in enumerate(unique_names)} # 生成映射说明文本 map_desc = "标签映射说明:\n" + "\n".join([f"{v}: {k}" for k,v in name_code_map.items()]) ax = target_df.plot(kind = 'line', y='Value', rot = 0) # 在画布右侧添加映射说明 ax.text(1.05, 0.5, map_desc, transform=ax.transAxes, bbox=dict(facecolor='white', edgecolor='gray', alpha=0.9), verticalalignment='center') # 调整画布右侧边距,给说明留出空间 plot.subplots_adjust(right=0.7) plot.title ('信号触发时的数值变化') plot.xlabel ('信号编号') plot.ylabel ('信号数值') plot.show () plot.clf () plot.close ()
内容的提问来源于stack exchange,提问作者MayEncoding
相关产品推荐
相关产品推荐

