如何将甘特图(Gantt Chart)与散点图结合进行可视化?
甘特图与散点图对齐问题
我想在甘特图上方可视化一系列数据点,理想效果可通过sns.stripplot和plt.barh实现。目前只能单独生成两个图表后手动叠加,尝试在同一画布中合并时,散点图无法与对应的甘特图步骤(条形)对齐。
数据准备代码
以下是创建散点图数据框df和甘特图数据框df_gantt的代码:
import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns %matplotlib inline pd.set_option('display.max_colwidth', None) # 设置行数和列数 num_rows = 10 num_cols = 3 # 创建包含随机数据的列字典 np.random.seed(12345) data = {f"Step {i}": np.random.uniform(low=0, high=5, size=num_rows) for i in range(1, num_cols + 1)} # 创建DataFrame df = pd.DataFrame(data) # 创建甘特图DataFrame num_steps = num_cols df_gantt = pd.DataFrame(columns=['Step', 'Start', 'End', 'Duration']) for i in range(1, num_steps + 1): start = 0 if i == 1 else df_gantt.loc[i - 2, 'End'] duration = np.random.randint(low=5, high=21) end = start + duration df_gantt = df_gantt.append({'Step': i, 'Start': start, 'End': end, 'Duration': duration}, ignore_index=True) df_gantt.columns = ['Milestone','start_num','end_num','days_start_to_end'] df_gantt.reset_index(inplace=True,drop=True) df_gantt['days_start_to_end_cum'] = df_gantt['days_start_to_end'] df_gantt['days_start_to_end_cum'] = df_gantt['days_start_to_end_cum'].cumsum() # 为原始数据框添加步骤偏移量 for col_idx, col in enumerate(df.columns): # 获取df_gantt中对应的行 row = df_gantt.iloc[col_idx] # 将days_start_to_end_cum的值加到对应列上 df[col] += row['days_start_to_end_cum']
生成错位图表的代码
以下是生成错位图表的代码:
# 创建画布和轴对象 fig, ax1 = plt.subplots(figsize=(16,8)) # 在第一个轴上绘制甘特图 ax1.barh(df_gantt.Milestone, df_gantt.days_start_to_end, left=df_gantt.start_num, color="#04AA6D", edgecolor="Black",zorder=2) for i in df_gantt.end_num.unique(): ax1.axvline(x=i,color='black', ls=':', lw=1.5,zorder=1) ax1.invert_yaxis() ax1.spines['top'].set_visible(False) ax1.spines['right'].set_visible(False) ax1.spines['bottom'].set_visible(False) ax1.spines['left'].set_visible(False) ax1.get_xaxis().set_visible(False) ax1.get_yaxis().set_visible(False) ax1.axvline(x=0,color='grey', ls=':', lw=0.3) # 创建共享x轴的第二个轴 ax2 = ax1.twinx() # 在第二个轴上绘制散点图 for i in df.columns: sns.stripplot(x=df[i], data=df, color='grey', edgecolor='black', linewidth=1, alpha=0.4, dodge=True, zorder=1, ax=ax2) ax2.scatter(x=df[i].mean(), y=0, zorder=2, marker="^", s=310, color="white", edgecolor='black', linewidth=2.5) ax2.axvline(x=0, color='grey', ls=':', lw=0.3) ax2.spines['top'].set_visible(False) ax2.spines['right'].set_visible(False) ax2.spines['bottom'].set_visible(False) ax2.spines['left'].set_visible(False) ax2.get_xaxis().set_visible(False) ax2.get_yaxis().set_visible(False) plt.xlim([-5, 70]) plt.show()
内容的提问来源于stack exchange,提问作者Ad D
相关产品推荐
相关产品推荐

