【问题标题】:How to plot two bar graphs side by side with columns from different dataframes in pandas如何在熊猫中与来自不同数据框的列并排绘制两个条形图
【发布时间】:2020-07-25 18:51:33
【问题描述】:

我想使用 matplotlib/seaborn 为两个国家 Covid-19 确诊病例并排绘制两个条形图:意大利和印度以进行比较。然而,在尝试了很多方法后,我无法解决这个问题。两国的确诊病例来自两个不同的数据框。

Data source

我想在 x 轴上绘制“日期”列,在 y 轴上绘制“确诊病例数”。
附上我的代码图片以供参考。
P.S:我也是数据可视化和熊猫的新手。

 import pandas as pd
 import numpy as np
 import matplotlib.pyplot as plt
 import seaborn as sns
 df = pd.read_csv('https://raw.githubusercontent.com/datasets/covid- 
 19/master/data/countries-aggregated.csv', parse_dates = ['Date'])
 df.head(5)

 ind_cnfd = df[['Date', 'Country', 'Confirmed']]
 ind_cnfd = ind_cnfd[ind_cnfd['Country']=='India']
 italy_cnfd = df[['Date', 'Country', 'Confirmed']]
 italy_cnfd = italy_cnfd[italy_cnfd['Country'] == 'Italy']

预期的输出类型: x轴为日期,y轴为确诊病例

【问题讨论】:

  • 我很乐意为您提供帮助,但下次请在问题中包含您的代码而不是屏幕截图。这使人们更容易重现您的代码,也意味着如果图像丢失,问题仍然有意义。谢谢!
  • 当然,德里克。这是我第一次在这里提出问题。以后会记得的。
  • 太棒了!我会尽快发布我的答案。
  • 更新了我的问题。请检查并让我知道任何解决方案。非常感谢!

标签: python pandas matplotlib data-visualization seaborn


【解决方案1】:

这是一个示例,说明您可以将 matplotlib 与 seaborn 结合使用。通过查看 matplotlib/seaborn 文档,随意使用轴设置、间距等。请注意,如果您想从笔记本运行任何此代码,我只做了import matplotlib.pyplot as plt。顺便说一句,我没有使用seaborn。

您可以选择在基于对数的 y 刻度上显示确诊病例,并使用以下行:plt.yscale('log')

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

df = pd.read_csv('https://raw.githubusercontent.com/datasets/covid-19/master/data/countries-aggregated.csv',
    parse_dates = ['Date'])

# select the Date, Country, Confirmed features from country, with reset of index
ind_cnfd = df[df.Country == 'India']
ind_cnfd = ind_cnfd[['Date', 'Confirmed']].reset_index(drop = True)
ind_cnfd = ind_cnfd.rename(columns = {'Confirmed': 'Confirmed Cases in India'})

italy_cnfd = df[df.Country == 'Italy']
italy_cnfd = italy_cnfd[['Date', 'Confirmed']].reset_index(drop = True)
italy_cnfd = italy_cnfd.rename(columns = {'Confirmed': 'Confirmed Cases in Italy'})

# combine dataframes together, turn the date column into the index
df_cnfd = pd.concat([ind_cnfd.drop(columns = 'Date'), italy_cnfd], axis = 1)
df_cnfd['Date'] = df_cnfd['Date'].dt.date
df_cnfd.set_index('Date', inplace=True)

# make a grouped bar plot time series
ax = df_cnfd.plot.bar()

# show every other tick label
for label in ax.xaxis.get_ticklabels()[::2]:
    label.set_visible(False)

# add titles, axis labels
plt.suptitle("Confirmed COVID-19 Cases over Time", fontsize = 15)
plt.xlabel("Dates")
plt.ylabel("Number of Confirmed Cases")
plt.tight_layout()
# plt.yscale('log')

plt.show()

【讨论】:

  • 这行得通,德里克。但是我可以得到我的问题中显示的输出吗?一开始我可能错误地提出了我的问题。我的错。
  • 哦,我明白了,那么就不需要子图了。我将您想要的称为“分组条形图”以供将来参考。考虑到印度和意大利确诊病例的差异,它可能看起来不太好,但很高兴尝试!
  • y 轴上的对数刻度可能是一个有趣的选择。
  • 顺便说一下,如果您觉得我的回答有帮助,请考虑采纳,谢谢! stackoverflow.com/help/someone-answers
猜你喜欢
  • 2017-07-20
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 2016-05-16
  • 1970-01-01
  • 2021-05-10
相关资源
最近更新 更多