【问题标题】:Pandas Dataframe plot not showing dates when matplotlib.dates used使用 matplotlib.dates 时,Pandas Dataframe 绘图未显示日期
【发布时间】:2020-04-17 22:02:00
【问题描述】:

我有以下代码,可以在某些日期按国家/地区绘制 COVID-19 确诊病例。

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates



df = pd.DataFrame({'Countries': ['Australia', 'India', 'UAE',  'UK'],
                   '3/1/20':    [   27,        3,   21,    36],
                   '3/2/20':    [   30,        5,   21,    40],
                   '3/3/20':    [   39,        5,   27,    51],
                   '3/4/20':    [   52,        28,   27,    86],
                   },
                   index = [0, 1, 2, 3])

print('Datframe:\n')
print(df)

dft=df.T
print('\n Transposed data:\n')
print(dft)

print(dft.columns)
dft.columns=dft.iloc[0]
dft=dft[1:]
print('\n Final data:\n')
print(dft)


dft.plot.bar(align='center')

# Set date ticks with 2-day interval
plt.gca().xaxis.set_major_locator(mdates.DayLocator(interval=2))

# Change date format
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%d-%m-%Y'))

''' Note: If I comment above two lines, I get back x-axis ticks. '''

# Autoformatting dates ticks
plt.gcf().autofmt_xdate()
plt.title('COVID-19 confirmed cases')

plt.show()

在这里,我打算以 2 天的间隔在 x 轴刻度上显示日期,并以不同的样式格式化日期。但是,在图中,我没有在 x 轴上看到任何刻度和标签,如下图所示。

但是,当我用 matplotlib.dates 注释掉说明时,我会返回 x-ticks 和标签。

这可以用简单的方式解释和解决吗?另外,我们可以用fig, ax = plt.subplots()得到同样的结果吗?

【问题讨论】:

  • 看我的回答,是你需要的吗?很高兴能提供更多帮助。
  • 在答案下方回复。

标签: python-3.x pandas dataframe date matplotlib


【解决方案1】:

你快到了。您需要做的就是重构您的数据框。索引日期。一种方法如下:

数据

df = pd.DataFrame({'Countries': ['Australia', 'India', 'UAE',  'UK'],
                   '3/1/20':    [   27,        3,   21,    36],
                   '3/2/20':    [   30,        5,   21,    40],
                   '3/3/20':    [   39,        5,   27,    51],
                   '3/4/20':    [   52,        28,   27,    86],
                   },
                   index = [0, 1, 2, 3])
df2=df.set_index('Countries').T.unstack().reset_index()
df2#.plot(kind='bar')
df2.columns=['Countries','Date','Count']
df2['Date']=pd.to_datetime(df2['Date'])
df2.dtypes

将日期粗略到日期时间

df2.set_index('Date', inplace=True)

在绘图前分组日期、国家和取消堆叠

df2.groupby([df2.index.date,df2['Countries']])['Count'].sum().unstack().plot.bar()

结果

【讨论】:

  • 但我想使用mdates 模块。这也没有两天的时间间隔。
  • 使用 mdates,我只能绘制折线图。 loc = DayLocator(bymonthday=1, interval=2) fig, ax = plt.subplots() ax.xaxis.set_major_locator(loc) ax.xaxis.set_major_formatter(mdates.DateFormatter('%m-%d')) #ax .xaxis.set_major_formatter(mdates.DateFormatter('%b%d')) df2.groupby([df2.index.date,df2['Countries']])['Count'].sum().unstack()。 plot(ax=ax) 当我尝试条形图时它失败了。 df2.groupby([df2.index.date,df2['Countries']])['Count'].sum().unstack().plot.bar(ax=ax)
  • 谢谢。我试过df3=df2.groupby([df2.index.date,df2['Countries']])['Count'].sum().unstack() ax.bar(df3.index, df3.columns) 并保留了格式。但是,这些图彼此重叠,我没有得到不同的颜色和位置。如果你发现了一个聪明的把戏,请告诉我。
猜你喜欢
  • 2019-05-03
  • 1970-01-01
  • 2017-10-28
  • 2014-03-24
相关资源
最近更新 更多