【问题标题】:How to fill the area between a rotated curve and 2 horizontal lines?如何填充旋转曲线和 2 条水平线之间的区域?
【发布时间】:2020-04-27 08:18:10
【问题描述】:

我有一条正态分布曲线和两条直线,有 2 个不同的 y 值,我只需要填充三者之间的区域。我一直在查看 fill_between 和多边形,但都无法为我工作。

        #Probability plot
        final_prices.sort()
        price_mean = np.mean(final_prices)
        price_standard = np.std(final_prices)
        normalized_df = stats.norm.pdf(final_prices, price_mean, price_standard)
        ax2.tick_params(direction='in', length=6, width=2, colors=color_tick, right=True, labelright='on')
        ax2.plot(normalized_df, final_prices, color=color_line)

        ax2.set_xlim([min(normalized_df), max(normalized_df)])
        ax2.set_ylim([min(final_prices), max(final_prices)])
        ax2.invert_xaxis()

        #mean line
        probability_frame = pd.DataFrame(final_prices, normalized_df)
        mean_price = probability_frame.loc[max(normalized_df), :].iloc[0]
        # ax2.axhline(y = mean_value, color=color_midline, linestyle='--')

        #standard deviation lines
        sigma = statistics.pstdev(final_prices)
        sigma_up_one = mean_price + sigma
        sigma_down_one = mean_price - sigma

        ax2.axhline(y=(sigma_up_one), color=color_sigma, linestyle='-')
        ax2.axhline(y=(sigma_down_one), color=color_sigma, linestyle='-')
        ax2.axhline(y=(sigma_up_one + sigma), color=color_sigma2, linestyle='-')
        ax2.axhline(y=(sigma_down_one - sigma), color=color_sigma2, linestyle='-')

        ax2.set_xlabel('Probability')
        ax2.set_ylabel('Price')
        ax2.set_title('Price Probability Distribution ' + ticker, color=color_label)
        ax2.xaxis.label.set_color(color_label)
        ax2.yaxis.label.set_color(color_label)

        plt.tight_layout()
        plt.show()

这是我当前的输出。

我需要填充最内层线之间的区域,这些线代表与平均值的第一个标准偏差,但只能填充到曲线线。提前谢谢你。

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    plt.fill_betweenx可以用来填充x=0和高斯曲线之间的区域。 where= 参数可以将填充限制在标准差定义的 y 值之间的区域。

    import matplotlib.pyplot as plt
    import numpy as np
    from scipy import stats
    
    price_mean = 216
    price_standard = 19
    final_prices = np.linspace(price_mean - 4*price_standard, price_mean + 4*price_standard, 200)
    
    norm_prices = stats.norm.pdf(final_prices, price_mean, price_standard)
    plt.plot(norm_prices, final_prices, color='crimson')
    plt.axhline(price_mean - price_standard)
    plt.axhline(price_mean + price_standard)
    
    plt.fill_betweenx(final_prices, 0, norm_prices,
                            where=(final_prices >= price_mean - price_standard) & (final_prices <= price_mean + price_standard),
                            color='green', alpha=0.3)
    plt.gca().invert_xaxis()
    plt.xlim(xmax=0)
    plt.show()
    

    【讨论】:

    • 谢谢!我会以你的名字命名我的孩子!