[英]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))
然后我以某种方式进一步操作数据以形成一个上限,以绘制为一条线对着条:
test_df['C'] = test_df.index
test_df['Upper'] = 4 * (test_df['C']/5)**0.5
test_df['Upper'].plot()
xlim
被更改,线图也不会像我对 pandas df 索引所期望的那样从索引 1 开始。我怎样才能解决上述问题?
在您的示例中,这里发生了两件事。
1) 当您使用test_df
的plot(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.