减少蜱虫和在Matplotlib中格式化轴标签 - 缩放

时间:2017-12-06 00:12:13

标签: python pandas matplotlib plot

我有一系列子图,但每当我尝试降低刻度密度甚至改变格式时,值似乎都会发生变化。

  1. ' tick'之间有区别吗?它的价值?如果是这样,我如何将正确的值与刻度匹配?
  2. 这是一个独立的情节:France
    enter image description here

    这是我尝试的(EDITED)代码:

    import matplotlib as mpl
    from matplotlib.ticker import FormatStrFormatter
    
    f, axarr = plt.subplots(5,6,figsize=(30,30))
    for i in range(0,6):
        for j in range(0,5):
            # there are only 26 entries in ser
            if (4*i+j) < 26:
                x = pp_gdp.loc[pp_gdp.index == ser.index[4*i+j],:].round(1)
                y = ser.loc[ser.index == ser.index[4*i+j],:].round(1)
                axarr[j,i].scatter(x,y)
                axarr[j,i].set_title(ser.index[4*i+j])
                 xt = axarr[j,i].get_xticks()
            #axarr[j,i].set_xscale('linear')
            axarr[j,i].set_xticks([axarr[j,i].get_xticks()[0],int(len(axarr[j,i].get_xticks())/2), axarr[j,i].get_xticks()[-1]])
            axarr[j,i].set_xticklabels([x.values.min(),sorted(x.values)[0][int(len(xt)/2)],x.values.max()])
            yt = axarr[j,i].get_yticks()
            #axarr[j,i].set_yscale('linear')
            axarr[j,i].set_yticks([axarr[j,i].get_yticks()[0],int(len(axarr[j,i].get_yticks())/2), axarr[j,i].get_yticks()[-1]])
            axarr[j,i].set_yticklabels([y.values.min(),sorted(y.values)[0][int(len(yt)/2)],y.values.max()]);
    

    如果我注释掉所有的刻度代码,即默认的子图,我会得到的结果如下: Default plot

    正如你所看到的,它太密集了,无法阅读。

    这是我尝试nbins时会发生什么:

    axarr[j,i].locator_params(tight=True, axis='y', nbins=10)
    axarr[j,i].locator_params(tight=True, axis='x', nbins=5)
    

    France nbins wrong
    enter image description here

    同样,两个轴上的值都是错误的。

    使用get_xticks和set_xticks作为大代码样本的一部分作品,但破坏了情节的直觉。由于它保持0的方式,因此规模也是错误的。

    非线性图保持线性,但斜率被夸大了。更复杂的情节完全失去了形状,如: China now wrong

    右边的图表更难理解,只是因为规模并不好看。

    用我的新

    谢谢, 罗伊

2 个答案:

答案 0 :(得分:0)

基于bgamari's answer to this question,我建议玩mpl.pyplot.locator_params(axis='x', nticks=4)

答案 1 :(得分:0)

我不知道为什么,但似乎在子图中从2个不同的数据框中拉出来让它非常不开心。

将一个数组附加到另​​一个数组然后从中创建子图似乎可以解决我的所有问题:

pp_gdp_1 = pp_gdp.loc[pp_gdp.index.isin(ser.index), :]
pp_gdp_s = pp_gdp_1.append(ser)
f, axarr = plt.subplots(7,4,figsize=(30,30))
for i in range(0,4):
    for j in range(0,7):
        # there are only 26 entries in ser
        if (7*i+j) < 26:
            x = pp_gdp_s.iloc[7*i+j].round(1)
            y = pp_gdp_s.iloc[(7*i+j)+len(ser)].round(1)
            axarr[j,i].scatter(x,y)
            axarr[j,i].set_title(ser.index[7*i+j])
            axarr[j,i].xaxis.set_major_locator(MaxNLocator(5))
            axarr[j,i].yaxis.set_major_locator(MaxNLocator(5))

这会产生我一次一个地绘制它们时会得到的结果: Grid of good plots