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

如何将甘特图(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 02:02:08