填充了对数刻度线,看起来像一个半圆

时间:2016-04-20 05:29:05

标签: python matplotlib

当我尝试使用背景数据和拟合线创建半对数图时,拟合线最终看起来完全不稳定。

import numpy as np
import matplotlib.pyplot as plt

k=0

for i in np.arange(0,len(emceeredshifts),7):
    zbin=emceeredshifts[i+1]
    lowradius = radius[(redshift <= (zbin + halfwidth)) & (redshift >= (zbin - halfwidth)) & (radius > 1) & (radius<20) &(mass>10.5)].flatten()
    lowmass = mass[(redshift <= (zbin + halfwidth)) & (redshift >= (zbin - halfwidth)) & (radius > 1) & (radius<20)&(mass>10.5)].flatten()
    if len(lowradius)>0:
        lowfit = np.polyfit(lowmass, lowradius, 1)
        lowlin,lowinter=np.poly1d(lowfit)
        lowbestfit = lowinter + lowlin * (lowmass )
        plt.plot( lowmass, lowbestfit, color=rainbowcolors[k], label=str(zbin))
    plt.scatter( lowmass, lowradius, color=rainbowcolors[k], marker='.', alpha=.2, edgecolor='none')
    k+=1

plt.legend(loc='lower right')

plt.title("Galaxy radius vs mass\nlinear mcmc mass predictions")
plt.xlabel("Log $M_\odot$")
plt.ylabel("Physical radius (kpc)")
plt.ylim(2,15)
plt.xlim(10.6,11.8)

plt.yscale('log')
plt.show()

这是有缺陷的半日志结果。 Buggy log-scale matplotlib line plot

这是我删除日志比例时得到的结果。当y轴是线性时,线条看起来像线条,数据看起来像数据。 Linear scale plot

出了什么问题?

1 个答案:

答案 0 :(得分:3)

您是否看过用于绘制这些线条的数组的内容?我怀疑他们没有排序,所以mpl正在点之间来回画线。在线性空间中,这只是沿着同一条线绘制,所以你看不到它,但在对数空间中,由于曲线,它是显而易见的。

我认为这个最小的例子证明了这个问题:

import numpy as np
import matplotlib.pyplot as plt

x = np.random.rand(1000)
y = x.copy()

fig,(ax1,ax2,ax3) = plt.subplots(3,figsize=(7,7))
fig.subplots_adjust(hspace=0.3)

ax1.plot(x,y)
ax1.set_title('linear')

ax2.plot(x,y)
ax2.set_yscale('log')
ax2.set_title('log, unsorted')

ind=np.argsort(x)
ax3.plot(x[ind],y[ind])
ax3.set_yscale('log')
ax3.set_title('log, sorted')

plt.show()

enter image description here