这是一个旧话题,但由于之前的答案没有完全回答原来的问题,我将具体回答这部分:
问题在于x轴标签过于拥挤且不可读,因此我不想打印所有标签,为了更好的可读性只打印其中一些。
我已尝试多种选项,包括xticks和xticklabel函数,但似乎都没有起作用。
由于sns.boxplot
返回一个Axis
对象,因此有两种方法可以设置标签:
- 要么使用
Axis.set(xticks=...,xticklabel=...)
,在本例中应该是box_plot.set(xticks=..., xticklabel=...)
,
- 要么使用
Axis.set.x_ticks(...)
和Axis.set.x_ticklabel(...)
,在本例中应该是box_plot.set.x_ticks(...)
和box_plot.set.x_ticklabel(...)
两种解决方案都应该可以正常工作,只要它们具有正确的参数。通常情况下,需要绘制的刻度标记(->标签位置)是整数/浮点数列表,需要绘制的标签是标签列表。
- 使用
xticks
,您可以选择在哪些位置绘制标签,还可以选择要显示哪些标签。
xticklabel
仅允许更改标签而不是其位置(!),因此应在xticks
之后使用。
有关如何使用它们的详细信息和示例,请参见matplotlib.axes.Axes.set_xticklabels和matplotlib.axes.Axes.set_xticks。
如果标签是浮点数(可能是分数),则使用round
可能有助于减小标签的大小并帮助清晰地绘制图表。
这里是一个示例,展示了我如何编写代码(使用serge's answer)以便每5个值打印一次标签:
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
data = pd.read_csv('your_data.csv', index_col=0)
box_plot = sns.boxplot(
x='Score',
y='Interest.Rate',
data=data
).set(
xlabel='FICO Score',
ylabel='Interest Rate'
)
step = 5
labels = [round(data['Score'][i], 4) for i in range(len(data['Score'][i])) if i % step == 0]
ticks = np.arange(stop = step * len(labels), step=step)
box_plot.set_xticks(ticks, labels)
plt.show()
round(data['Score'][i], 4)
可以防止得分在小数点后超过4位进行绘图
if i % step == 0
只有当i是step的倍数时才选择一个值
np.arange(stop = step * len(labels), step=step)
返回一个整数数组,从0开始每个索引按步长递增,并且最后一个值小于stop。 这似乎是获取刻度位置的最简单方法,但是任何其他具有整数或浮点数的类似于列表的对象都可以。 如果它恰好有len(labels)
项...
我选择了box_plot.set_xticks
,因为对刻度和标签变量需要进行一些小操作。这更多是个人选择。
注意:如果刻度的位置存在问题,则以下链接可能有所帮助:How to properly use matplotlib's set_xticks?(或与Axes.set_xticks相关的其他答案)
AttributeError: 未知属性 ylabel
- CGFoXxlabel
命令应该在set
API 中。 - Arka Mukherjee