为什么matplotlib .plot(kind ='bar')图与.plot()如此不同

时间:2019-06-21 13:46:08

标签: python matplotlib

这可能是一个非常愚蠢的问题,但是当使用.plot()绘制Pandas DataFrame时,它很快并且会生成带有适当索引的图形。一旦我尝试将其更改为条形图,它似乎就失去了所有格式,并且索引变得疯狂。为什么会这样呢?是否有一种简单的方法可以绘制与折线图相同格式的条形图?

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

df = pd.DataFrame()
df['Date'] = pd.date_range(start='01/01/2012', end='31/12/2018')
df['Value'] = np.random.randint(low=5, high=100, size=len(df))
df.set_index('Date', inplace=True)

df.plot()
plt.show()

df.plot(kind='bar')
plt.show()

df.plot()

df.plot(kind='bar'

更新: 为了进行比较,如果我将数据放入Excel中,然后创建一个折线图,然后立即创建一个条形图(“列”),它将转换该图并保持轴标签与折线图相同。如果我尝试用多年的每日数据在Python中生成许多条形图,那将花费很长时间。有没有等效的方法可以在Python中执行此Excel转换?

Excel plots

2 个答案:

答案 0 :(得分:2)

熊猫柱状图本质上是分类的;也就是说,每个条形图都是一个单独的类别,并且它们都有自己的标签。熊猫目前无法绘制数字条形图(以与线条图相同的方式)。

相反,如果输入数据是数字或日期,则matplotlib bar的图是数字的。所以

plt.bar(df.index, df["Value"])

产生

enter image description here

但是请注意,由于数据框中有2557个数据点,这些数据点仅分布在几百个像素上,因此并未实际绘制所有条形图。相反,如果要显示每个小节,则最终图像中的小节必须为一个像素宽。这意味着您的图形每边的5%边距需要超过2800像素宽或矢量格式。

因此,与其显示每日数据,不如将其汇总为每月或每季度数据是有意义的。

答案 1 :(得分:1)

默认的.plot()用直线连接所有数据点并生成线图。

另一方面,.plot(kind='bar')每个数据点绘制为离散条形。为了在x轴上获得正确的格式,必须在绘图后修改刻度标签。