You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何删除子图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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 03:39:01