我正在尝试将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开始。
我该如何解决上面的问题?
2条答案
按热度按时间iih3973s1#
在你的例子中有两件事发生。
1)当您使用
test_df
的plot(kind='bar')
方法制作'A'
和'B'
的条形图时,pandas创建了一个图,其中test_df.index
中的值用作列'A'
和'B'
中相应对的x轴刻度标签。我假设pandas这样做是因为条形图通常与x轴上的分类变量一起使用,这可以通过下面的代码来说明:字符串
它产生:
x1c 0d1x的数据
这意味着第一个图中的x轴刻度标签不是绘制值的实际x值。相反,
1
实际上位于x = 0,因为它是索引的第一个值,而20
位于x = 19。您可以通过检查x轴限值来推断这一点:型
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坐标以绘制条形图,但我现在似乎找不到它。4xrmg8kj2#
您可以使用以下代码将折线图与条形图对齐:
字符串