在Python中组合线图和面积图

问题描述 投票:0回答:1

我有以下数据框,显示了每天两个指数的特定度量,以及最右侧指数之间的各自差异。出于简单目的,仅显示几天。

有效日期 索引A 索引B B 减 A
2024-10-01 91 111 20
2024-10-02 88 110 22
2024-10-03 87 109 22
2024-10-04 84 107 23
2024-10-07 82 106 24

我使用上面的数据框创建了一个线图,在辅助 y 轴上显示“B-A”。下面的输出数据略有不同。是否可以将“B-A”制作为面积图而不是线图? 我基本上希望填充“B-A”下方的区域(如果可能的话,不一定再显示“B-A”线。

df = df.rename(columns={"eff_date":"Date"})
plt.figure(figsize = (12,6))
plot = sns.lineplot(x = 'Date', y = 'Index A', data = df, label = 'Index A')
sns.lineplot(x = 'Date', y = 'Index B', data = df, label = 'Index B')
ax2 = plt.twinx()
sns.lineplot(x = 'Date', y = 'B-A', data = df, color='r', ax=ax2)

plt.xticks(rotation=45)

plot.set(xlabel = 'Date', ylabel = 'Measure')

enter image description here

python seaborn area line-plot
1个回答
0
投票

您可以提取绘制的曲线,然后使用 matplotlib 的

fill_between()
来绘制区域:

from matplotlib import pyplot as plt
import seaborn as sns
import pandas as pd

df = pd.DataFrame({'Date': ['2024-10-01', '2024-10-02', '2024-10-03', '2024-10-04', '2024-10-07'],
                   'Index A': [91, 88, 87, 84, 82],
                   'Index B': [111, 110, 109, 107, 106],
                   'B minus A': [20, 22, 22, 23, 24]})

plt.figure(figsize=(12, 6))
ax = sns.lineplot(x='Date', y='Index A', data=df, label='Index A')
sns.lineplot(x='Date', y='Index B', data=df, label='Index B', ax=ax)

ax2 = ax.twinx()
sns.lineplot(x='Date', y='B minus A', data=df, color='r', ax=ax2)
line = ax2.get_lines()[0]
ax2.fill_between(line.get_xdata(), 0, line.get_ydata(),
                 color='r', alpha=0.1, label='B minus A')
line.remove()

handles1, labels1 = ax.get_legend_handles_labels()
handles2, labels2 = ax2.get_legend_handles_labels()
ax.legend(handles=handles1 + handles2, labels=labels1 + labels2, loc='upper left', bbox_to_anchor=(1.01, 1.01))
plt.tight_layout()
plt.show()
© www.soinside.com 2019 - 2024. All rights reserved.