【发布时间】:2017-12-06 00:12:13
【问题描述】:
我有一组子图,但每当我尝试降低刻度密度甚至更改格式时,值似乎都会发生变化。
- '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)
同样,两个轴上的值都是错误的。
使用 get_xticks 和 set_xticks 就像在大代码示例中一样工作,但会破坏情节的直觉。此外,由于保持 0 的方式,刻度也完全错误。
非常线性的图保持线性,但斜率被夸大了。稍微复杂一点的图完全失去了形状,如下所示: China now wrong
右边的图表更难理解,只是因为音阶打得不好。
我的新人
谢谢, 罗伊
【问题讨论】:
-
我发现不清楚问题出在哪里。默认标签有什么问题?它会自动为您选择漂亮的刻度和刻度标签。
-
它太密集了,我不确定如何在不返回错误标签值的情况下将其稀释。我将添加一张我得到的默认图片。
-
您可以使用
MaxNLocator来减少每个轴的刻度。 -
谢谢,我刚刚试过了,我遇到了与垃圾箱相同的问题......标签错误。
-
标签不能“错误”。你可以更好地解释你想要达到的目标。但由于也没有可用的minimal reproducible example,我怀疑这个问题是否可以解决。
标签: python pandas matplotlib plot