使用seaborn/matplotlib箱线图时的刻度频率

27
我正在使用seaborn绘制一系列箱线图。
sns.boxplot(full_array)

其中full_array包含200个数组。因此,我有200个箱线图和x轴上从0到200的刻度。

xticks太靠近了,我想只显示一些,例如每20个带标签的xtick。

我尝试了几种解决方案,如这里提到的那些,但它们都没有起作用。

每次我对xticks进行采样,我都会得到错误的刻度标签,因为它们被编号为0到N,间距为单位。

例如,使用以下行:

ax.xaxis.set_major_locator(ticker.MultipleLocator(20))

我每隔20个刻度获得一个标记为 xtick,但这些标签是1、2、3、4,而不是20、40、60、80...
2个回答

41

Seaborn的箱线图使用FixedLocator和FixedFormatter,即:

print ax.xaxis.get_major_locator()
print ax.xaxis.get_major_formatter()

打印

<matplotlib.ticker.FixedLocator object at 0x000000001FE0D668>
<matplotlib.ticker.FixedFormatter object at 0x000000001FD67B00>
因此,仅将定位器设置为MultipleLocator是不足够的,因为刻度的值仍将由固定的格式化程序设置。
相反,您需要设置一个ScalarFormatter,它将刻度标签设置为与其位置上的数字对应。
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import seaborn.apionly as sns
import numpy as np

ax = sns.boxplot(data = np.random.rand(20,30))

ax.xaxis.set_major_locator(ticker.MultipleLocator(5))
ax.xaxis.set_major_formatter(ticker.ScalarFormatter())

plt.show()

在此输入图片描述


1
如果x轴的数据类型是字符串,那该怎么办呢?请告诉我在这种情况下如何设置xticks的频率。 - weefwefwqg3
3
请不要在其他问题的评论中提出新问题。如果这个问答不能解决您的问题,请使用有关您遇到问题的 [mcve] 提出新问题。 - ImportanceOfBeingErnest
@ImportanceOfBeingErnest,这里的 ax.xaxis.set_major_locator(ticker.MultipleLocator(5)) 中的 5 是什么意思? - Jason Goal
@JasonGoal,“5”表示在视图间隔内的每个整数倍上显示一个勾号。 - Chong Onn Keat

0
在现代版本的seaborn(v.0.12.0等)中,刻度值是由FuncFormatter设置的,因此OP的初始尝试可以正常工作。
import numpy as np
import seaborn as sns
from matplotlib.ticker import MultipleLocator

data = np.random.rand(20,30)
ax = sns.boxplot(data=data)

ax.xaxis.get_major_locator()                    # <matplotlib.ticker.FixedLocator at 0x2221f657340>
ax.xaxis.get_major_formatter()                  # <matplotlib.ticker.FuncFormatter at 0x2221f8e2a00>

ax.xaxis.set_major_locator(MultipleLocator(5))  # show every 5th tick

另一种可行的方法是通过选择每5个来设置xticks。

ax = sns.boxplot(data=data);
ax.set_xticks(ax.get_xticks()[::5]);            # show every 5th tick

result


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