在 seaborn 的箱线图中更改 X 轴标签

19

我有一个包含多列的pandas dataframe,我想要绘制"Score"列(x轴)和另一列名为"interest rate"的数据。我使用以下命令:

box_plot=sns.boxplot(x=list(Dataframe['Score']),y=list(Dataframe['Interest.Rate']),data=Dataframe)
box_plot.set(xlabel='FICO Score',ylabel='Interest Rate')

这个功能很好用,可以创建一个带有适当坐标轴的盒状图。看起来我必须将变量作为列表传递给boxplot函数。也许有更好的方法。

问题是x轴标签过于拥挤,难以阅读,因此我不想全部打印它们,只想打印其中一些,以获得更好的可读性。

我尝试了多种选项,使用xticks和xticklabel函数,但似乎没有一种有效的方法。

3个回答

23

你可以简单地这样做:

import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt

data = pd.read_csv('your_data.csv', index_col=0)

sns.boxplot(
    x='Score', 
    y='Interest.Rate', 
    data=data
).set(
    xlabel='FICO Score', 
    ylabel='Interest Rate'
)
plt.show()

2
不起作用 AttributeError: 未知属性 ylabel - CGFoX
它是有效的,xlabel 命令应该在 set API 中。 - Arka Mukherjee

1
尝试用这种方式:
box_plot=sns.boxplot(x='Score', y='Interest.Rate',data=Dataframe)

不要将pandas系列转换为列表

如果您需要X轴方面的帮助,请发布样本数据集,以便重现您的问题。


0

这是一个旧话题,但由于之前的答案没有完全回答原来的问题,我将具体回答这部分:

问题在于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_xticklabelsmatplotlib.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'
)
# select one label every 5 labels
step = 5
# select which label to plot
labels = [round(data['Score'][i], 4) for i in range(len(data['Score'][i])) if i % step == 0]
# select the position of the labels
ticks = np.arange(stop = step * len(labels), step=step)  # as many ticks as there are labels
# apply this setting...
box_plot.set_xticks(ticks, labels)
# ... and plot the result
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相关的其他答案)


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