matplotlib fill_between:填充间隙

时间:2021-01-06 16:09:56

标签: python matplotlib

我正在绘制一条两条线,一条水平线,一条一条多次穿过水平线的时间序列。我需要在两条线之间填充,只有 above 水平线。我似乎被间隙(离散的 x 轴点之间)困住了,或者不得不在水平线以下填充。

以下是两次尝试:

import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
sns.set_style('darkgrid')

quarters_display = {2000.25: 'Q1 2000', 2000.5: 'Q2 2000', 2000.75: 'Q3 2000', 2001.0: 'Q4 2000', 2001.25: 'Q1 2001', 2001.5: 'Q2 2001', 2001.75: 'Q3 2001', 2002.0: 'Q4 2001', 2002.25: 'Q1 2002', 2002.5: 'Q2 2002', 2002.75: 'Q3 2002', 2003.0: 'Q4 2002', 2003.25: 'Q1 2003', 2003.5: 'Q2 2003', 2003.75: 'Q3 2003', 2004.0: 'Q4 2003'}
x = ['Q1 2000', 'Q2 2000', 'Q3 2000', 'Q4 2000', 'Q1 2001', 'Q2 2001', 'Q3 2001', 'Q4 2001', 'Q1 2002', 'Q2 2002', 'Q3 2002', 'Q4 2002', 'Q1 2003', 'Q2 2003', 'Q3 2003', 'Q4 2003', 'Q1 2004', 'Q2 2004', 'Q3 2004', 'Q4 2004', 'Q1 2005', 'Q2 2005', 'Q3 2005', 'Q4 2005', 'Q1 2006', 'Q2 2006', 'Q3 2006', 'Q4 2006', 'Q1 2007', 'Q2 2007', 'Q3 2007', 'Q4 2007']
y = np.array([601677., 642013., 655769., 609374., 619893., 670448., 676796.,
        622917., 632426., 673863., 686151., 638813., 643959., 686960.,
        695933., 643595., 648373., 683883., 706748., 654726., 659802.,
        702148., 719273., 661400., 672264., 729783., 728807., 671351.,
        679398., 724370., 734278., 677896.])
y2 = 676796
pre_peak_qtr = x.index(quarters_display[2001.75])
nadir_qtr = x.index(quarters_display[2002.0])
recovery_qtr = x.index(quarters_display[2002.75])

xi = np.arange(len(x))

fig, ax = plt.subplots(figsize=(20, 10))

ax.plot(x, y, color='navy', linewidth=2, alpha=0.8, label=None)
ax.fill_between(x=xi, y1=y, y2=y2, color='red', alpha=0.1, label='Decline',
                where=(xi >= pre_peak_qtr) & (xi <= nadir_qtr))
ax.fill_between(x=xi, y1=y, y2=y2, color='gold', alpha=0.1, label='Recovery',
                where=(xi >= nadir_qtr) & (xi <= recovery_qtr))
ax.fill_between(x=xi, y1=y, y2=y2, color='green', alpha=0.1, label='Growth',
                where=(xi >= recovery_qtr) & (y >= y2))
                # where=(xi >= recovery_qtr))
ax.margins(x=0)
ax.tick_params(axis='x', labelrotation=45)
ax.legend()
plt.tight_layout()
plt.show()

chart with gaps

x = ['Q1 2000', 'Q2 2000', 'Q3 2000', 'Q4 2000', 'Q1 2001', 'Q2 2001', 'Q3 2001', 'Q4 2001', 'Q1 2002', 'Q2 2002', 'Q3 2002', 'Q4 2002', 'Q1 2003', 'Q2 2003', 'Q3 2003', 'Q4 2003', 'Q1 2004', 'Q2 2004', 'Q3 2004', 'Q4 2004', 'Q1 2005', 'Q2 2005', 'Q3 2005', 'Q4 2005', 'Q1 2006', 'Q2 2006', 'Q3 2006', 'Q4 2006', 'Q1 2007', 'Q2 2007', 'Q3 2007', 'Q4 2007']
y = np.array([601677., 642013., 655769., 609374., 619893., 670448., 676796.,
        622917., 632426., 673863., 686151., 638813., 643959., 686960.,
        695933., 643595., 648373., 683883., 706748., 654726., 659802.,
        702148., 719273., 661400., 672264., 729783., 728807., 671351.,
        679398., 724370., 734278., 677896.])
y2 = 676796
pre_peak_qtr = x.index(quarters_display[2001.75])
nadir_qtr = x.index(quarters_display[2002.0])
recovery_qtr = x.index(quarters_display[2002.75])

xi = np.arange(len(x))

fig, ax = plt.subplots(figsize=(20, 10))

ax.plot(x, y, color='navy', linewidth=2, alpha=0.8, label=None)
ax.fill_between(x=xi, y1=y, y2=y2, color='red', alpha=0.1, label='Decline',
                where=(xi >= pre_peak_qtr) & (xi <= nadir_qtr))
ax.fill_between(x=xi, y1=y, y2=y2, color='gold', alpha=0.1, label='Recovery',
                where=(xi >= nadir_qtr) & (xi <= recovery_qtr))
ax.fill_between(x=xi, y1=y, y2=y2, color='green', alpha=0.1, label='Growth',
                # where=(xi >= recovery_qtr) & (y >= y2))
                where=(xi >= recovery_qtr))
ax.margins(x=0)
ax.tick_params(axis='x', labelrotation=45)
ax.legend()
plt.tight_layout()
plt.show()

chart with both

关于如何填充线上方和离散 x xaxis 点之间的任何建议?

提前致谢!

0 个答案:

没有答案