如何删除子图x轴上重复、空值或未标记的刻度位置
解决方案
要去掉x轴多余空白点位,核心是不要直接用Final索引的原始值作为x轴坐标,而是将出现过的Final唯一值映射为连续的整数坐标,再把x轴刻度替换为原始的Final值即可,具体修改如下:
import pandas as pd import numpy as np from matplotlib import pyplot as plt import matplotlib.ticker as ticker data = {'Name': ['immoControlCmd', 'BrkTerrMde', 'GlblClkYr', 'HsaStat', 'TesterPhysicalResGWM', 'FapLc','FirstRowBuckleDriver', 'GlblClkDay'], 'Value': [0, 5, 0, 4, 0, 1, 1, 1], 'Id_Par': [0, 0, 3, 3, 3, 3, 0, 0] } signals_df = pd.DataFrame(data) def plot_signals(signals_df): # Count signals by par signals_df['Count'] = signals_df.groupby('Id_Par').cumcount().add(1).mask(signals_df['Id_Par'].eq(0), 0) # Subtract Par values from the index column signals_df['Sub'] = signals_df.index - signals_df['Count'] id_par_prev = signals_df['Id_Par'].unique() id_par = np.delete(id_par_prev, 0) signals_df['Prev'] = [1 if x in id_par else 0 for x in signals_df['Id_Par']] signals_df['Final'] = signals_df['Prev'] + signals_df['Sub'] # Convert and set Subtract to index signals_df.set_index('Final', inplace=True) # 新增代码:创建Final值到连续x坐标的映射 unique_final = sorted(signals_df.index.unique()) final_to_x = {val: idx for idx, val in enumerate(unique_final)} x_total = len(unique_final) # Get individual names and variables for the chart names_list = [name for name in signals_df['Name'].unique()] num_names_list = len(names_list) # Creation Graphics fig, ax = plt.subplots(nrows=num_names_list, figsize=(10, 10), sharex=True) # 修改xticks:只用存在的Final值生成刻度 plt.xticks(np.arange(0, x_total), unique_final, color='SteelBlue', fontweight='bold') for pos, (a_, name) in enumerate(zip(ax, names_list)): # Get data data = signals_df[signals_df["Name"] == name]["Value"] # 修改x_:用映射后的连续坐标作为x值 mapped_x = [final_to_x[i] for i in data.index.values] x_ = np.hstack([-1, mapped_x, x_total - 1]) # Get values axis-x and axis-y y_ = np.hstack([0, data.values, data.iloc[-1]]) # Plotting the data by position ax[pos].plot(x_, y_, drawstyle='steps-post', marker='*', markersize=8, color='k', linewidth=2) ax[pos].set_ylabel(name, fontsize=8, fontweight='bold', color='SteelBlue', rotation=30, labelpad=35) ax[pos].yaxis.set_major_formatter(ticker.FormatStrFormatter('%0.1f')) ax[pos].yaxis.set_tick_params(labelsize=6) ax[pos].grid(alpha=0.4, color='SteelBlue') plt.show() plot_signals(signals_df)
修改说明
- 对
Final索引的唯一值排序后做映射,把离散跳变的Final值转换成从0开始的连续整数,避免x轴出现空白位置 - 调整x轴刻度的生成逻辑,只保留实际存在的
Final值作为刻度标签 - 绘制每个子图时,把原始的
Final索引值替换成映射后的连续坐标再传入绘图函数 - 方案兼容你当前的Python、Pandas、Matplotlib版本,不需要额外安装依赖
内容的提问来源于stack exchange,提问作者MayEncoding
相关产品推荐
相关产品推荐

