Matplotlib,情节和条形图不符合相同的指数

时间:2016-03-16 16:32:08

标签: python pandas matplotlib plot

我试图将大熊猫数据框绘制为条形图和线图。

这个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的索引正如预期的那样好: enter image description here

然后,我以某种方式进一步操纵数据,形成一个上限,绘制成一条反对条形的线:

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

然而,这并不按预期工作: enter image description here

  • x轴已移位,现在并非所有数据都可见
  • 即使xlim被更改,线图也不会像我对pandas df索引所期望的那样从索引1开始。

如何解决上述问题?

2 个答案:

答案 0 :(得分:1)

您的示例中有两件事情发生。

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

产生:

Bar Chart

这意味着第一个图中的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-19之间。这样你就知道所有的x坐标都是一样的。然后在绘制它们之后,您可以使用(1.0, 20.0)明确设置x-tick标签。

你可以添加ax.set_xticklabels(['your', 'x', 'tick', 'labels']) kwarg来设置x坐标以绘制条形图,但我现在似乎无法找到它。

答案 1 :(得分:0)

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

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