【问题标题】:Reduce ticks & format axis labels in Matplotlib - scaling减少 Matplotlib 中的刻度和格式轴标签 - 缩放
【发布时间】:2017-12-06 00:12:13
【问题描述】:

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

  1. 'tick' 和它的值之间有区别吗?如果是这样,我如何将正确的值与刻度匹配?

这是一个正确的独立情节:France

这是我正在尝试的(已编辑)代码:

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

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

使用 get_xticks 和 set_xticks 就像在大代码示例中一样工作,但会破坏情节的直觉。此外,由于保持 0 的方式,刻度也完全错误。

非常线性的图保持线性,但斜率被夸大了。稍微复杂一点的图完全失去了形状,如下所示: China now wrong

右边的图表更难理解,只是因为音阶打得不好。

我的新人

谢谢, 罗伊

【问题讨论】:

  • 我发现不清楚问题出在哪里。默认标签有什么问题?它会自动为您选择漂亮的刻度和刻度标签。
  • 它太密集了,我不确定如何在不返回错误标签值的情况下将其稀释。我将添加一张我得到的默认图片。
  • 您可以使用MaxNLocator 来减少每个轴的刻度。
  • 谢谢,我刚刚试过了,我遇到了与垃圾箱相同的问题......标签错误。
  • 标签不能“错误”。你可以更好地解释你想要达到的目标。但由于也没有可用的minimal reproducible example,我怀疑这个问题是否可以解决。

标签: python pandas matplotlib plot


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我不知道为什么,但似乎从子图中的 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

    【讨论】: