如何在Seaborn FacetGrid中设置对数刻度后的刻度?

11

我正在尝试绘制一个由直方图组成的FacetGrid,y轴进行了对数变换。但我无法将yticks设置为更易读的格式。

ticks = [0.1, 0.3, 1, 3, 10, 30, 100, 300, 1000, 3000, 10000]
labels = [i for i in ticks]
grid = sns.FacetGrid(data = df, col = 'LoanStatus', col_wrap = 4)
grid.map(plt.hist, 'credit_score_range_average', bins = 20).set(yscale ='log', yticks = (ticks, labels))

我收到一个值错误:数组中有多个元素的真实值是模棱两可的。使用a.any()或a.all()。 输入图像描述

enter image description here

在matplotlib中,通过设置yticks = (ticks, labels)来实现这一点。

在编写时尝试了一些最后的选项,我选择了sns.distplot,并发现它对我的情况更好。我仍然感激任何对此问题的见解。


通常错误回溯(不仅仅是最后一行)可以提供有关任何问题的有价值的见解。您可以在此处发布它,以及一个[mcve](即可运行的代码)。 - ImportanceOfBeingErnest
添加了。抱歉字体较小。当尝试仅设置yticks = ticks时,代码可以运行但不会产生预期效果。 - stephen barter
2
我明白了,你的意思是要写成.set(yscale='log', yticks=ticks, yticklabels=labels)对吗? - ImportanceOfBeingErnest
嗯,所以程序可以运行,但仍然没有应用正确的刻度。我从来不知道那是一个参数,所以我相信将来会很有用。 - stephen barter
如果您想提供一些可运行的代码,我可以尝试查看问题所在。 - ImportanceOfBeingErnest
在你的帮助和一些试错之后,我找到了一个可行的解决方案,请看我的解决方案。感谢你引导我走向正确的方向。 - stephen barter
1个回答

13

我终于找到了一个有效的解决方案。奇怪的是,你必须在新的一行上再次调用grid.set()。希望这能节省其他人的时间。您也不能在此行中包含yscale参数,否则它将失败。

ticks = [0.1, 0.3, 1, 3, 10, 30, 100, 300, 1000, 3000, 10000, 30000]
labels = [i for i in ticks]
grid = sns.FacetGrid(data = df, col = 'LoanStatus', col_wrap = 4)
grid.map(plt.hist, 'credit_score_range_average').set(yscale = 'log')
grid.set(yticks = ticks, yticklabels = labels)

在此输入图片描述


3
这并不像看起来那么奇怪。如果您设置了比例尺,它将覆盖定位器和格式化程序。因此,您必须在设置比例尺之后设置刻度和标签。如果它们在同一个“.set”中,这不能保证。 - ImportanceOfBeingErnest

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接