如何绘制x轴显示Group1且带分组切换垂直线的折线图
解决方案:按Group2顺序绘制折线图并添加分组垂直线
需求说明
- 以
Value列为y轴,严格按照Group2的出现顺序绘制折线图 - x轴标签显示
Group1(而非Group2) - 在
Group1取值切换的位置添加蓝色垂直线,区分不同大组的绘图区域
数据集示例
| Group1 | Group2 | Value |
|---|---|---|
| A | A1 | 0.06 |
| A | A2 | 0.12 |
| A | A3 | 0.11 |
| A | A4 | 0.04 |
| B | B1 | 0.09 |
| B | B2 | 0.20 |
| C | C1 | 0.10 |
| C | C2 | 0.08 |
| C | C3 | 0.20 |
实现代码
import pandas as pd import matplotlib.pyplot as plt # 构造数据集 a = {'Group1':['A', 'A', 'A', 'A', 'B', 'B','C', 'C', 'C'], 'Group2': ['A1', 'A2', 'A3', 'A4', 'B1', 'B2', 'C1', 'C2', 'C3'], 'Value':[0.06, 0.12, 0.11, 0.04, 0.09, 0.2, 0.1, 0.08, 0.2]} df = pd.DataFrame(a) # 重置索引,方便用行索引对应Group2的出现顺序 df = df.reset_index(drop=True) # 定位Group1分组切换的位置:找到每个新分组的起始行索引 switch_points = df[df['Group1'] != df['Group1'].shift(1)].index[1:] # 计算垂直线的x坐标(位于两个分组的中间位置) vline_x = [x - 0.5 for x in switch_points] # 绘制图表 plt.figure(figsize=(10, 6)) # 按Group2顺序绘制折线图 plt.plot(df.index, df['Value'], marker='o', color='blue', linewidth=2) # 添加分组分隔的蓝色垂直线 for x in vline_x: plt.axvline(x=x, color='blue', linestyle='--', alpha=0.7) # 设置x轴刻度标签为Group1 plt.xticks(ticks=df.index, labels=df['Group1'], rotation=0) # 设置图表标签与标题 plt.xlabel('Group1', fontsize=10) plt.ylabel('Value', fontsize=10) plt.title('Value Trend with Group Separators', fontsize=12) plt.tight_layout() plt.show()
代码说明
- 索引重置:将原多级索引的DataFrame重置为普通索引,用行索引对应
Group2的出现顺序,保证折线图的绘制顺序正确。 - 切换点定位:通过比较当前行与前一行的
Group1值,找到每个新分组的起始位置,计算出分组之间的中间坐标作为垂直线位置。 - 折线绘制:以行索引为x轴、
Value为y轴绘制折线,确保顺序与Group2一致。 - x轴标签替换:将x轴的刻度标签替换为
Group1的值,满足显示需求。 - 垂直线添加:在分组切换的中间位置添加蓝色虚线,清晰区分不同大组的绘图区域。
内容的提问来源于stack exchange,提问作者user280809
相关产品推荐
相关产品推荐

