基于code、time_1与time_2的散点图绘制技术求助
解决方案:基于项目分组的时间散点图绘制
嘿,我来帮你搞定这个散点图的需求!你的场景是每个项目(code)有多个可变的time_1值,但每个项目的time_2是固定的,核心是要把这两个时间维度在图里清晰展现出来对吧?下面给你两种常用的实现方案,都是基于Python的主流可视化库,你可以按需选择:
方法1:用Seaborn快速实现(推荐)
Seaborn的分组散点图功能很适合你的场景,一行代码就能按code区分不同项目,还能轻松添加固定time_2的标记。
首先先模拟你的数据结构(你直接替换成自己的真实数据集就行):
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 模拟你的数据集:code是项目标识,time_1每行不同,同一code的time_2相同 data = pd.DataFrame({ 'code': ['A', 'A', 'A', 'B', 'B', 'C', 'C', 'C', 'C'], 'time_1': [10, 12, 15, 8, 9, 14, 16, 18, 20], 'time_2': [13, 13, 13, 9, 9, 17, 17, 17, 17] })
然后绘制散点图,同时为每个项目标记出固定的time_2:
# 设置清爽的绘图风格 sns.set_style("whitegrid") plt.figure(figsize=(10, 6)) # 绘制每个项目的time_1散点,按code区分颜色 sns.scatterplot(data=data, x='code', y='time_1', hue='code', s=100, alpha=0.7, label='Time 1 (Variable)') # 提取每个项目唯一的time_2值,用大的X形点标记 code_time2 = data[['code', 'time_2']].drop_duplicates() sns.scatterplot(data=code_time2, x='code', y='time_2', hue='code', s=200, marker='X', label='Time 2 (Fixed per Project)') # 美化图表细节 plt.title('Scatter Plot: Variable Time_1 vs Fixed Time_2 per Project', fontsize=14) plt.xlabel('Project Code', fontsize=12) plt.ylabel('Time Value', fontsize=12) plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left') # 把图例放在图外避免遮挡 plt.tight_layout() plt.show()
方法2:用Matplotlib自定义绘制(更灵活)
如果你需要更个性化的样式(比如自定义标记、颜色、布局),可以用Matplotlib手动循环每个项目来绘制:
import pandas as pd import matplotlib.pyplot as plt # 同样用模拟数据,替换成你的真实数据即可 data = pd.DataFrame({ 'code': ['A', 'A', 'A', 'B', 'B', 'C', 'C', 'C', 'C'], 'time_1': [10, 12, 15, 8, 9, 14, 16, 18, 20], 'time_2': [13, 13, 13, 9, 9, 17, 17, 17, 17] }) plt.figure(figsize=(10, 6)) unique_codes = data['code'].unique() # 为每个项目分配不同的颜色 colors = plt.cm.tab10(range(len(unique_codes))) # 循环处理每个项目 for i, code in enumerate(unique_codes): project_data = data[data['code'] == code] # 绘制当前项目的所有time_1散点 plt.scatter([code]*len(project_data), project_data['time_1'], color=colors[i], s=100, alpha=0.7, label=f'{code} - Time 1') # 获取当前项目的固定time_2值,用X形点标记 time2_val = project_data['time_2'].iloc[0] plt.scatter(code, time2_val, color=colors[i], s=200, marker='X', label=f'{code} - Time 2') # 美化图表 plt.title('Time Distribution by Project', fontsize=14) plt.xlabel('Project Code', fontsize=12) plt.ylabel('Time', fontsize=12) plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left') plt.grid(axis='y', linestyle='--', alpha=0.7) plt.tight_layout() plt.show()
额外小提示
如果你的time_1和time_2是datetime日期类型(不是数值),只需要添加一行代码来优化日期标签的显示:
plt.gcf().autofmt_xdate() # 旋转日期标签,避免重叠
另外,如果你想直接对比每个time_1相对于固定time_2的偏移,可以把time_1和time_2分别作为横轴和纵轴:
sns.scatterplot(data=data, x='time_1', y='time_2', hue='code', s=100)
内容的提问来源于stack exchange,提问作者Gus
相关产品推荐
相关产品推荐

