pandas 折线图和条形图不与同一指数对齐

gojuced7  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(117)

我正在尝试将Pandas数据框绘制为条形图和线形图。
这个MWE总结了我所看到的:

import pandas as pd
import matplotlib.pyplot as plt

test_df = pd.DataFrame(np.random.rand(20,2), columns = ['A', 'B'])

test_df['A'] = test_df['A'].cumsum()
test_df['B'] = test_df['B'].cumsum()
test_df.index += 1

字符串
然后,我绘制了条形图:

ax = test_df.plot(kind='bar', colors=['red', 'blue'], figsize = (13.5,6))


这与预期的df:

的索引关系良好
然后,我以某种方式进一步处理这些数据,形成一个上限,并将其绘制为一条与条形相对的直线:

test_df['C'] = test_df.index
test_df['Upper'] = 4 * (test_df['C']/5)**0.5
test_df['Upper'].plot()


但是,这并不按预期工作:

  • x轴已移动,现在并非所有数据都可见
  • 即使xlim发生了变化,线图也不会像我从Pandasdf索引中所期望的那样从索引1开始。

我该如何解决上面的问题?

iih3973s

iih3973s1#

在你的例子中有两件事发生。
1)当您使用test_dfplot(kind='bar')方法制作'A''B'的条形图时,pandas创建了一个图,其中test_df.index中的值用作列'A''B'中相应对的x轴刻度标签。我假设pandas这样做是因为条形图通常与x轴上的分类变量一起使用,这可以通过下面的代码来说明:

>>> test_df.index = [1, 2, 3, 4, 100, 6, 7, 8, 9, 10,
                     11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
>>> ax = test_df[['A', 'B']].plot(kind='bar', color=['red', 'blue'])

字符串
它产生:
x1c 0d1x的数据
这意味着第一个图中的x轴刻度标签不是绘制值的实际x值。相反,1实际上位于x = 0,因为它是索引的第一个值,而20位于x = 19。您可以通过检查x轴限值来推断这一点:

>>> ax.get_xlim()
(-0.5, 19.5)


2)调用test_df['Upper'].plot()(不带kind='bar')绘制'Upper'列中的值,并使用test_df.index作为x坐标。此调用使用当前轴,看起来它还更改了x轴限制以适应最近绘制的数据,其x值为1到20。如果您检查第二个图上的轴限制,则它们将为(1.0, 20.0)
为了解决这一切,我建议在绘制数据之前 * 不要 * 递增索引并将其保持在0-19之间。这样你就知道所有的x坐标都是相同的。然后在绘制它们之后,你可以显式地设置ax.set_xticklabels(['your', 'x', 'tick', 'labels'])的x-tick标签。
可能有一个kwarg可以添加到df.plot(kind='bar', ...),它将设置x坐标以绘制条形图,但我现在似乎找不到它。

4xrmg8kj

4xrmg8kj2#

您可以使用以下代码将折线图与条形图对齐:

ax.set_xlim(ax.get_xlim()[0]-0.5, ax.get_xlim()[1]+0.5)

字符串

相关问题