繁体   English   中英

Matplotlib、绘图和条形图未与同一索引对齐

[英]Matplotlib, plot and bar chart don't align against the same index

我正在尝试将 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被更改,线图也不会像我对 pandas df 索引所期望的那样从索引 1 开始。

我怎样才能解决上述问题?

在您的示例中,这里发生了两件事。

1) 当您使用test_dfplot(kind='bar')方法制作'A''B' test_df ,pandas 创建一个图,其中test_df.index中的值用作 x 轴刻度标签对于'A''B'列中的相应对。 我假设大熊猫这样做是因为条形图通常与 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'])

其中产生:

条形图

这意味着第一个图中的 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 坐标以绘制条形图,但我目前似乎找不到它。

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

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

暂无
暂无

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

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