简体   繁体   English

如何为从pandas DataFrame创建的条形图设置x轴刻度位置?

[英]How can I set the x-axis tick locations for a bar plot created from a pandas DataFrame?

I have a simple plot, with x labels of 1, 1.25, 1.5, 1.75, 2 etc. up to 15: 我有一个简单的情节,x标签为1,1.25,1.5,1.75,2等,最多15:

在此输入图像描述

The plot was created from a pandas.DataFrame without specifying the xtick interval: 该图是从pandas.DataFrame创建的,没有指定xtick间隔:

speed.plot(kind='bar',figsize=(15, 7))

Now I would like the x-interval to be in increments of 1 rather than 0.25, so the labels would read 1,2,3,4,5 etc. 现在我希望x-interval的增量为1而不是0.25,因此标签会显示为1,2,3,4,5等。

I'm sure this is easy but I cannot for the life of me figure it out. 我确信这很容易,但我不能为我的生活弄清楚。

I've found plt.xticks() which seems like it's the right call but maybe it's set_xticks ? 我发现plt.xticks()似乎是正确的调用,但也许它是set_xticks

I've changed the x ticks a great amount without doing what I wanted up until this point. 在此之前我没有按照我想要的方式更改了x刻度。 Any help would be greatly appreciated. 任何帮助将不胜感激。

The way that pandas handles x-ticks for bar plots can be quite confusing if your x-labels have numeric values. 如果您的x标签具有数值,那么pandas处理条形图的x-ticks的方式可能会非常混乱。 Let's take this example: 我们来看这个例子:

import pandas as pd
import numpy as np

x = np.linspace(0, 1, 21)
y = np.random.rand(21)
s = pd.Series(y, index=x)

ax = s.plot(kind='bar', figsize=(10, 3))
ax.figure.tight_layout()

在此输入图像描述

You might expect the tick locations to correspond directly to the values in x , ie 0, 0.05, 0.1, ..., 1.0. 您可能希望刻度线位置直接对应于x的值,即0,0.05,0.1,...,1.0。 However, this isn't the case: 但是,情况并非如此:

print(ax.get_xticks())
# [ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20]

Instead pandas sets the tick locations according to the indices of each element in x , but then sets the tick labels according to the values in x : 而是pandas根据x中每个元素的索引设置tick 位置 ,但是然后根据x设置tick 标签

print(' '.join(label.get_text() for label in ax.get_xticklabels()))
# 0.0 0.05 0.1 0.15 0.2 0.25 0.3 0.35 0.4 0.45 0.5 0.55 0.6 0.65 0.7 0.75 0.8 0.85 0.9 0.95 1.0

Because of this, setting the tick positions directly (either by using ax.set_xticks ) or passing the xticks= argument to pd.Series.plot() will not give you the effect you are expecting: 因此,直接设置刻度位置(通过使用ax.set_xticks )或将xticks=参数传递给pd.Series.plot()将不会产生您期望的效果:

new_ticks = np.linspace(0, 1, 11)       # 0.0, 0.1, 0.2, ..., 1.0
ax.set_xticks(new_ticks)

在此输入图像描述


Instead you would need to update the positions and the labels of your x-ticks separately: 相反,您需要分别更新x-ticks的位置和标签:

# positions of each tick, relative to the indices of the x-values
ax.set_xticks(np.interp(new_ticks, s.index, np.arange(s.size)))

# labels
ax.set_xticklabels(new_ticks)

在此输入图像描述

This behavior actually makes a lot of sense in most cases. 在大多数情况下,这种行为实际上很有意义。 For bar plots it is common for the x-labels to be non-numeric (eg strings corresponding to categories), in which case it wouldn't be possible to use the values in x to set the tick locations. 对于条形图,x标签通常是非数字的(例如,对应于类别的字符串),在这种情况下,不可能使用x的值来设置刻度位置。 Without introducing another argument to specify their locations, the most logical choice would be to use their indices instead. 如果不引入另一个参数来指定它们的位置,最合乎逻辑的选择是使用它们的索引。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM