matplotlib fill_between未到达X中的指定位置

u2nhd7ah  于 2023-05-23  发布在  其他
关注(0)|答案(1)|浏览(158)

我使用matplot fill_between,在高斯曲线中绘制一个区域,但其中一个区域没有到达指定位置,我不知道为什么会发生这种情况,这是我的代码,我包含了一些plt.annote箭头,以清楚地表明fill_between函数没有到达指定位置:这是有问题的线路:ax.fill_between(x,0,y,where=(x<=especificacion),color='red',alpha=0.4)
下面是代码的重要部分:

from scipy.stats import norm
fig,ax=plt.subplots(figsize=(10,8))
mean=29.02
std=4.01
especificacion=23.52

def gaussian_curve(x,mu,sigma):
  return norm.pdf(x,loc=mu,scale=sigma)

#GraficarcadacurvadeGaussyagregarunaleyenda
x=np.linspace(mean-(3*std),mean+(3*std))
y=gaussian_curve(x,mean,std)
ax.plot(x,y,color='blue')
fcr2=mean-(std*1.2812)
ax.set_xlim([mean-(3*std),mean+(3*std)])
ax.fill_between(x,0,y,where=(x<=fcr2),hatch='///',color='blue',alpha=0.2)
ax.fill_between(x,0,y,where=(x<=especificacion),color='red',alpha=0.4)

valor_y=norm.pdf(especificacion,loc=mean,scale=std)

plt.annotate(f'fcr:{especificacion}',xy=(especificacion,valor_y),xytext=(especificacion,valor_y+0.02),
arrowprops=dict(facecolor='black'))
plt.annotate(f'fc10:{round(fcr2,2)}',xy=(round(fcr2,2),0),xytext=(round(fcr2,2),0.01),
arrowprops=dict(facecolor='black'))

1.我试着像这样在位置上添加小数:ax.fill_between(x,0,y,where=(x<=especificacion+0.3),color='red',alpha=0.4)但它不工作
1.改变区域的绘制顺序,但它不会到达该位置。
1.在X轴上添加限制

ar5n3qh5

ar5n3qh51#

可以指定要使用np.linspace生成的点数。从the numpy documentation
num int,可选要生成的样本数。默认值为50。必须为非负数
通过增加要生成的样本数,每个点之间差距减小。你不能保证它是一个精确的匹配,但它会更接近你的目标值。在下面的示例中,我将num设置为200。

from scipy.stats import norm
import numpy as np
import matplotlib.pyplot as plt
fig,ax=plt.subplots(figsize=(10,8))
mean = 29.02
std = 4.01
especificacion = 23.52

def gaussian_curve(x,mu,sigma):
  return norm.pdf(x,loc=mu,scale=sigma)

#GraficarcadacurvadeGaussyagregarunaleyenda
x = np.linspace(mean-(3*std), mean+(3*std), num=200)
y = gaussian_curve(x,mean,std)
ax.plot(x,y,color='blue')
fcr2 = mean-(std*1.2812)
ax.set_xlim([mean-(3*std),mean+(3*std)])
ax.fill_between(x,0,y,where=(x<=fcr2),hatch='///',color='blue',alpha=0.2)
ax.fill_between(x,0,y,where=(x<=especificacion),color='red',alpha=0.4)

valor_y = norm.pdf(especificacion,loc=mean,scale=std)

plt.annotate(f'fcr:{especificacion}',xy=(especificacion,valor_y),xytext=(especificacion,valor_y+0.02),
arrowprops=dict(facecolor='black'))
plt.annotate(f'fc10:{round(fcr2,2)}',xy=(round(fcr2,2),0),xytext=(round(fcr2,2),0.01),
arrowprops=dict(facecolor='black'))

或者,如果您需要与目标数字完全匹配,则可以向numpy数组添加一个虚拟变量,对其进行排序,然后绘制y值。

x = np.append(np.linspace(mean-(3*std),mean+(3*std)), [especificacion])
x = np.sort(x)
y = gaussian_curve(x,mean,std)
(rest of code the same)

相关问题