Python matplotlib中不需要的白色列--如何删除?

Python matplotlib中不需要的白色列--如何删除?,python,matplotlib,Python,Matplotlib,下面是python代码(移植自Richard McElreath出色的统计反思),它在我的结果图中产生了一个不需要的白色trasparent“列”: import numpy as np import pandas as pd import scipy.stats import matplotlib.pyplot as plt # import data url = "https://raw.githubusercontent.com/pymc-devs/resources/mas

下面是python代码(移植自Richard McElreath出色的统计反思),它在我的结果图中产生了一个不需要的白色trasparent“列”:

import numpy as np
import pandas as pd
import scipy.stats

import matplotlib.pyplot as plt

# import data
url = "https://raw.githubusercontent.com/pymc-devs/resources/master/Rethinking_2/Data/Howell1.csv"


df = pd.read_csv(url, delimiter = ';')
df2 = df[df.age >= 18]

# sample priors (prior predictive check)

n = 100
a = scipy.stats.norm.rvs(178, 20, n)
b1 = scipy.stats.norm.rvs(0, 10, n)
b2 = np.exp(scipy.stats.norm.rvs(0, 1, n))

xbar = df2.weight.mean()


# compare 2 priors

fig,ax = plt.subplots(1,2,sharey=True)

for i in range(100):
    ax[0].plot(df2.weight, a[i] + b1[i]*(df2.weight - xbar),color = 'grey',lw=.5,alpha=.2)
    ax[0].set_xlabel('weight')
    ax[0].set_ylabel('height')
    ax[0].set_title('normal prior of β')
    ax[1].plot(df2.weight, a[i] + b2[i]*(df2.weight - xbar),color = 'grey',lw=.5,alpha=.2)
    ax[1].set_xlabel('weight')
    ax[1].set_title('log-normal prior of β')

plt.axis([30,60,-100,400])
plt.show()

这发生在我的Jupyter笔记本、Google CoLab和pdf(plt.savefig)中

我的笔记本版本: numpy 1.19.4 熊猫1.1.5 scipy 1.5.4 matplotlib 3.3.3


谢谢

我手动设置这些值,但是如果为每个图形设置轴,边距将消失

ax[0].axis([33,63,-100,400])
ax[1].axis([33,60,-100,400])

如果要缩小图形之间的间距,可以通过以下方式进行

fig.subplots_adjust(wspace=0.05)

我想你指的是线条画得更细/更轻的区域,而不是边界

我发现这与别名有关,而不是数据本身

使用抗锯齿参数:

ax[0].plot(..., antialiased=False)
看起来像这样:

当然,这会使绘图看起来很难看,但您可以增加图形大小或dpi参数

fig.set_dpi(300.0)
...
plt.show();
然后你得到这个:


这是一个以有趣的方式与抗锯齿交互的数据工件。在最终图像中,我们必须为每个像素选择一种颜色。如果没有消除混叠,当我们必须绘制一条线时,我们必须确定该像素是“在”线中(因此我们对其着色)还是“在”线外(在这种情况下,我们不对其着色),这可能会导致阶梯状线条(尤其是接近平面的线条)。使用抗锯齿功能,我们根据像素“在”行与“不在”行的比例为像素上色。这抹掉了我们的眼睛(以一种好的方式),我们看到了一条更令人信服的直线。如果不使用抗锯齿或alpha,多次绘制同一条线不会改变外观(任何给定的像素仍然处于内部或外部),但是使用抗锯齿或alpha,每次绘制线时,任何“部分”像素都会变暗

在原始数据中,
df2.weight
中的值都落在同一行上,但它们没有排序,因此在绘制时,它们在同一路径上来回移动(请参见左中面板中的轨迹)。根据转折点的确切位置以及任何给定线段的穿越次数,某些地方的线条看起来会比其他地方更暗。数据的确切结构中有某种东西导致了这种“带”

如果增加DPI,像素会变小,因此效果会变得不明显(类似于放大),如果启用抗锯齿,效果会变得不明显。我怀疑(但还没有测试)如果你洗牌的数据,你将能够移动乐队周围

对权重进行排序(从这个上下文来看,我认为它们的顺序没有意义?)会使底部两个面板中的绘图看起来更好

简言之,这个波段是“真实的”,因为它代表了数据中的某些东西,而不是渲染过程中的一个bug,但它突出显示了数据中我认为没有意义的结构

将numpy导入为np
作为pd进口熊猫
导入scipy.stats
将matplotlib.pyplot作为plt导入
#导入数据
url=”https://raw.githubusercontent.com/pymc-devs/resources/master/Rethinking_2/Data/Howell1.csv"
#这是一个mpl 3.3特性
图,ad=plt.子地块_马赛克(
[
[“正常”、“对数正常”],
[“跟踪”、“历史记录”],
[“排序正常”、“排序日志正常”],
],
受约束的布局=真,
)
df=pd.read_csv(url,分隔符=“;”)
df2=df[df.age>=18]
#样本先验(先验预测检查)
n=100
a=scipy.stats.norm.rvs(178,20,n)
b1=scipy.stats.norm.rvs(0,10,n)
b2=np.exp(scipy.stats.norm.rvs(0,1,n))
def内部(重量、a、b1、b2、最大值):
xbar=np.平均值(重量)
对于范围(100)内的i:
ax_dict[“正常”]绘图(
权重,a[i]+b1[i]*(权重-xbar),color=“grey”,lw=0.5,alpha=0.2
)
ax_dict[“正常”]。设置标签(“重量”)
ax_dict[“正常”]。设置标签(“高度”)
ax_dict[“normal”]。设置标题(“β的normal previor”)
ax_dict[“对数正常”]绘图(
权重,a[i]+b2[i]*(权重-xbar),color=“grey”,lw=0.5,alpha=0.2
)
ax_dict[“对数正常”]。设置标签(“重量”)
ax_dict[“对数正常”]。设置标题(“β的对数正常之前”)
内部(df2.重量,a,b1,b2,ad)
内在的(
np.数组(已排序(df2.权重)),
A.
b1,
b2,
{“正常”:ad[“排序正常”],“日志正常”:ad[“排序正常”]},
)
ad[“hist”].hist(df2.weight,箱子=100,color=“0.5”)
ad[“历史”]。设置标签(“重量”)
ad[“hist”]。设置标签(“#”)
ad[“跟踪”]绘图(df2.weight,“-o”,color=“0.5”,alpha=0.5)
ad[“跟踪”]。设置标签(“重量”)
ad[“跟踪”]。设置标签(“索引”)
plt.show()