我有以下数据框,显示了每天两个指数的特定度量,以及最右侧指数之间的各自差异。出于简单目的,仅显示几天。
有效日期 | 索引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')
您可以提取绘制的曲线,然后使用 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()