在pyplot中填充曲线和2条线之间的区域的最佳方法是什么?

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

我有一个正态分布曲线和两个在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()

这是我当前的输出。

enter image description here

我需要填充最里面的线之间的区域,这些区域代表与平均值的第一标准偏差,但仅直到曲线线为止。预先谢谢你。

python matplotlib statistics fill
1个回答
0
投票

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()

example plot

© www.soinside.com 2019 - 2024. All rights reserved.