如何绘制二分类Class数据与连续xcentre数据的组合图表
实现方案:绘制xcentre折线与Class=1标记图
步骤1:导入依赖库
import pandas as pd import matplotlib.pyplot as plt
步骤2:准备数据(直接替换为你的真实DataFrame即可)
# 示例数据,与你提供的结构一致 data = { 'Class': [0,0,0,0,0,0,0,0,0,0], 'Frame': [1,2,3,4,5,6,7,8,9,10], 'X1': [465,465,465,465,464,464,464,464,464,464], 'Y1': [570]*10, 'X2': [577,577,577,577,577,577,576,576,576,576], 'Y2': [698,699,699,699,699,699,699,699,699,699], 'xcentre': [521.0,521.0,521.0,521.0,520.5,520.5,520.0,520.0,520.0,520.0] } df = pd.DataFrame(data)
步骤3:绘制图表
提供两种实现方式,可根据示例图样式选择:
方式1:用条形图标记Class=1位置
fig, ax1 = plt.subplots(figsize=(10,6)) # 绘制红色折线:xcentre随Frame的变化趋势 ax1.plot(df['Frame'], df['xcentre'], color='red', linewidth=2, label='xcentre') ax1.set_xlabel('Frame') ax1.set_ylabel('xcentre Value', color='red') ax1.tick_params(axis='y', labelcolor='red') # 创建双y轴,避免数值范围冲突 ax2 = ax1.twinx() # 绘制Class=1的条形标记 ax2.bar(df['Frame'], df['Class'], color='darkblue', alpha=0.6, label='Class=1') ax2.set_ylabel('Class', color='darkblue') ax2.tick_params(axis='y', labelcolor='darkblue') ax2.set_ylim(0, 1.2) # 适配Class的0/1二进制值范围 # 合并两个轴的图例 lines1, labels1 = ax1.get_legend_handles_labels() lines2, labels2 = ax2.get_legend_handles_labels() ax1.legend(lines1 + lines2, labels1 + labels2, loc='upper right') plt.title('xcentre Trend with Class=1 Markers') plt.show()
方式2:用竖线标记Class=1位置(更贴近示例图样式)
如果示例图中的Class标记是底部竖线,替换条形图代码为竖线绘制:
fig, ax1 = plt.subplots(figsize=(10,6)) # 红色折线部分保持不变 ax1.plot(df['Frame'], df['xcentre'], color='red', linewidth=2, label='xcentre') ax1.set_xlabel('Frame') ax1.set_ylabel('xcentre Value', color='red') ax1.tick_params(axis='y', labelcolor='red') ax2 = ax1.twinx() # 筛选Class=1的Frame位置,绘制竖线标记 class_1_frames = df[df['Class'] == 1]['Frame'] ax2.vlines(class_1_frames, ymin=0, ymax=1, color='darkblue', linewidth=4, label='Class=1') ax2.set_ylabel('Class', color='darkblue') ax2.tick_params(axis='y', labelcolor='darkblue') ax2.set_ylim(0, 1.2) # 合并图例 lines1, labels1 = ax1.get_legend_handles_labels() lines2, labels2 = ax2.get_legend_handles_labels() ax1.legend(lines1 + lines2, labels1 + labels2, loc='upper right') plt.title('xcentre Trend with Class=1 Markers') plt.show()
关键说明
- 双y轴设计:解决xcentre数值范围与Class的0/1范围差异问题,保证两个元素清晰显示
- 样式自定义:可通过修改
color、linewidth、alpha等参数,匹配你需要的视觉效果
内容的提问来源于stack exchange,提问作者Giulia Ciminelli
相关产品推荐
相关产品推荐

