我正在尝试绘制概率分布的积分,类似于此图像:
请注意 Y 轴如何开始向顶部变得更加细化。
我已经有了想要绘制的精确百分位数,以及 x 轴的相应值。
到目前为止我的代码是:
import matplotlib.pylab as plt
import numpy as np
import scipy as sp
from scipy import stats
x = np.array([0.0000025,0.000005,0.00001,0.00002,0.00003,0.00004,0.00005,0.00006,0.00007,0.00008,0.00009,0.0001,0.0002,0.00025,0.00035,0.0005,0.001,0.002,0.005,0.01,1])
y = np.array([0,0,0,0,0,0,0,0,46.29821447,49.49781571,49.83072758,50.89081787,98.49113721,98.5522082,99.29547499,99.91765345,99.93779431,99.95351796,99.98066963,99.99294867,100])
my_xticks = ['<2.5 uS', '<5 uS', '<10 uS', '<20 uS', '<30 uS', '<40 uS', '<50 uS', '<60 uS', '<70 uS', '<80 uS', '<90 uS', '<100 uS', '<200 uS', '<250 uS', '<350 uS', '<500 uS', '<1 mS', '<2 uS', '<5 mS', '<10 mS', '<1 S']
plt.xticks(x, my_xticks)
plt.yticks(np.arange(y.min() - 20, y.max() + 1, 10))
plt.xticks(np.arange(x.min() + 0.035, x.max(), 0.08))
plt.plot(x, y)
plt.grid(axis='y')
plt.show()
输出如下:
更新
因此,我设法准确地分割多个图 10,同时为每个图分配不同的 y 轴限制,以便将数据点分开以提高可读性。这都是硬编码的,这提出了自己的挑战,因为我将使用值非常接近的不同向量提供动态数据。我可以设计函数来分析值彼此的接近度,基于此绘制 x 数量的图并分配限制,但这对于必须绘制多个图的工作和资源来说是过多的。这是我到目前为止所拥有的,
x = np.array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21])
y = np.array([0,0,0,0,0,0,0,0,46.29821447,49.49781571,49.83072758,50.89081787,98.49113721,98.5522082,99.29547499,99.91765345,99.93779431,99.95351796,99.98066963,99.99294867,100])
my_xticks = ['<2.5 uS', '<5 uS', '<10 uS', '<20 uS', '<30 uS', '<40 uS', '<50 uS', '<60 uS', '<70 uS', '<80 uS', '<90 uS', '<100 uS', '<200 uS', '<250 uS', '<350 uS', '<500 uS', '<1 mS', '<2 uS', '<5 mS', '<10 mS', '<1 S']
f,(ax,ax2,ax3,ax4,ax5,ax6,ax7,ax8,ax9,ax10) = plt.subplots(10,1,sharex=True)
majorFormatter = FormatStrFormatter('%.7f')
plt.subplots_adjust(hspace=0)
plt.xticks(x, my_xticks)
ax.grid(axis='y')
ax2.grid(axis='y')
ax3.grid(axis='y')
ax4.grid(axis='y')
ax5.grid(axis='y')
ax6.grid(axis='y')
ax7.grid(axis='y')
ax8.grid(axis='y')
ax9.grid(axis='y')
ax10.grid(axis='y')
ax.plot(x,y, '-r')
ax.plot(x,y, '.')
ax2.plot(x,y, '.')
ax2.plot(x,y, '-r')
ax3.plot(x,y, '.')
ax3.plot(x,y, '-r')
ax4.plot(x,y, '.')
ax4.plot(x,y, '-r')
ax5.plot(x,y, '.')
ax5.plot(x,y, '-r')
ax6.plot(x,y, '.')
ax6.plot(x,y, '-r')
ax7.plot(x,y, '.')
ax7.plot(x,y, '-r')
ax8.plot(x,y, '.')
ax8.plot(x,y, '-r')
ax9.plot(x,y, '.')
ax9.plot(x,y, '-r')
ax10.plot(x,y, '.')
ax10.plot(x,y, '-r')
ax.set_yticks(y)
ax2.set_yticks(y)
ax3.set_yticks(y)
ax4.set_yticks(y)
ax5.set_yticks(y)
ax6.set_yticks(y)
ax7.set_yticks(y)
ax8.set_yticks(y)
ax9.set_yticks(y)
ax10.set_yticks(y)
ax.set_ylim(99.95,100)
ax2.set_ylim(99.8,99.95)
ax3.set_ylim(99.5,99.8)
ax4.set_ylim(99,99.5)
ax5.set_ylim(98.5,99)
ax6.set_ylim(93,98.5)
ax7.set_ylim(90,93)
ax8.set_ylim(86,90)
ax9.set_ylim(70,86)
ax10.set_ylim(0,70)
ax.spines['bottom'].set_visible(False)
ax2.spines['top'].set_visible(False)
ax2.spines['bottom'].set_visible(False)
ax3.spines['top'].set_visible(False)
ax3.spines['bottom'].set_visible(False)
ax4.spines['top'].set_visible(False)
ax4.spines['bottom'].set_visible(False)
ax5.spines['top'].set_visible(False)
ax5.spines['bottom'].set_visible(False)
ax6.spines['top'].set_visible(False)
ax6.spines['bottom'].set_visible(False)
ax7.spines['top'].set_visible(False)
ax7.spines['bottom'].set_visible(False)
ax8.spines['top'].set_visible(False)
ax8.spines['bottom'].set_visible(False)
ax9.spines['top'].set_visible(False)
ax9.spines['bottom'].set_visible(False)
ax10.spines['top'].set_visible(False)
ax.yaxis.set_major_formatter(majorFormatter)
ax2.yaxis.set_major_formatter(majorFormatter)
ax3.yaxis.set_major_formatter(majorFormatter)
ax4.yaxis.set_major_formatter(majorFormatter)
ax5.yaxis.set_major_formatter(majorFormatter)
ax6.yaxis.set_major_formatter(majorFormatter)
ax7.yaxis.set_major_formatter(majorFormatter)
ax8.yaxis.set_major_formatter(majorFormatter)
ax9.yaxis.set_major_formatter(majorFormatter)
ax10.yaxis.set_major_formatter(majorFormatter)
plt.show()
最佳答案
y 从 x = 0.00006 处的 0 增加到 x = 0.01 处的 99.99,然后仅在 < em>x = 0.01 且 x = 1。该线基本上呈 L 形笔直向上,非常靠近绘图的左侧和上边界,因此被轴遮挡。
如果您将轴限制设置得稍微宽一点:
plt.xlim(-0.1, 1.1)
plt.ylim(-10, 110)
然后你就可以轻松地看到发生了什么:
正如 @snorthway 评论的那样,在对数刻度上绘制这些数据可能更明智(如您显示的示例图像所示):
plt.loglog(x, y)
但是,您将遇到 y 值包含 0 的问题。由于 log(0) = -无穷大,对于 x < 0.00007,该线变为垂直。
关于python - 在 matplotlib 中绘制概率分布的积分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29662432/