【问题标题】:seaborn or matplotlib bar plot multiple dataframes side by sideseaborn 或 matplotlib bar 并排绘制多个数据帧
【发布时间】:2018-08-23 15:47:52
【问题描述】:

使用 matplotlib 我试图将条形图放在一起。这很常见,我已经浏览了一堆 stackoverflow 页面,但还是有问题。

df1

    Net Count   date
0   AA  242624806   2018-03-01 00:00:00.000
1   AA  213729127   2018-03-01 00:01:00.000
2   AA  4482234727  2018-03-01 00:02:00.000
3   AA  26042386    2018-03-01 00:03:00.000
4   AA  13444400    2018-03-01 00:04:00.000

df2

    Net Count   date
0   BB  242806      2018-03-01 00:00:00.000
1   BB  729127      2018-03-01 00:01:00.000
2   BB  85872722    2018-03-01 00:02:00.000
3   BB  26006231    2018-03-01 00:03:00.000
4   BB  123115400   2018-03-01 00:04:00.000

df3

    Net Count   date
0   CC  452806      2018-03-01 00:00:00.000
1   CC  129127      2018-03-01 00:01:00.000
2   CC  858722      2018-03-01 00:02:00.000
3   CC  26216231    2018-03-01 00:03:00.000
4   CC  33115400    2018-03-01 00:04:00.000

代码:

x=df['date']  #since the date are the same in both tables I only have 1 x
y=df['count']
y2=d2['count']
y3=d2['count']

plt.figure(figsize=(15,8))
plt.bar(x,y,label="AA")
plt.bar(x,y2,label="BB")
plt.bar(x,y3,label="CC")

plt.title("Count by Networks")
plt.legend(title="Network")
plt.show()

这是它的外观: 但我已经尝试过align=edgealign=center 并玩弄宽度,但它总是重叠。

我将如何进行这项工作,以使条不堆叠,使它们并排?

像这样:


**** 已更新答案 *****
Y.Luo 这对我来说最适合这样的熊猫:

dateindex=df1['date']

aa=dict(zip(x,df1['count']))
bb=dict(zip(x,df2['count']))
cc=dict(zip(x,df3['count']))
dd=dict(zip(x,df4['count']))
ee=dict(zip(x,df5['count']))


dfbar = pd.DataFrame({'AA': aa, 'BB': bb, 'CC': cc,'DD': dd, 'EE': ee}, index=dateindex)

# Non-stacked bar plot
dfbar.plot.bar(figsize=(16, 6))

plt.title("Count by Networks")
plt.legend(title="Network")
plt.show() 

【问题讨论】:

  • 您可以将数据合并到一个数据框中,每个原始数据框一列,并用熊猫绘制它。您还可以附加所有数据框以创建一个长表格,其中另一列指定类别并使用 seaborn 的 hue 参数。我认为这两种方法都有足够的问题。如果您在实施它们时遇到问题,请针对该问题提出具体问题。
  • 这就是问题@ImportanceOfBeingErnest 的方式太多了。您建议使用哪种方法,这对所有这些仍然有点新。我想要一个 matplotlib 中的 ^ 示例,因为我最常使用它
  • 熊猫是最简单的。 Matplotlib 是最通用的。您的数据框中的日期是实际日期还是字符串?
  • 它是一个日期,由 date_trunc('minute', log_time) 生成。我还看到了一些关于 plt.hist
  • 您知道要回答这个问题,我现在需要自己复制这些数据帧。这真的是太多的工作了。如果您需要帮助,只需从一开始就提供minimal reproducible example

标签: matplotlib plot jupyter-notebook seaborn


【解决方案1】:

如果你想要一个使用 matplotlib 的非堆叠条形图,你需要自己调整每个数据框的位置,如下所示:

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

# Example data
n=24
dateindex = pd.date_range(pd.datetime(2018, 1, 1), periods=n)
np.random.seed(1)
aa = pd.DataFrame(np.random.randn(n), columns=['count'], index=dateindex)
np.random.seed(2)
bb = pd.DataFrame(np.random.randn(n), columns=['count'], index=dateindex)
np.random.seed(3)
cc = pd.DataFrame(np.random.randn(n), columns=['count'], index=dateindex)

# Non-stacked bar plot
plt.figure(figsize=(16, 6))
width = 0.25
plt.bar(np.arange(len(aa))-width, aa.values, width, label="AA")
plt.bar(np.arange(len(aa)), bb.values, width, label="BB")
plt.bar(np.arange(len(aa))+width, cc.values, width, label="CC")
plt.xticks(np.arange(len(aa)), dateindex, rotation='vertical')

plt.title("Count by Networks")
plt.legend(title="Network")
plt.show()

ImportanceOfBeingErnest 是正确的。 Pandas 是最简单的,因为它会为您进行调整:

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

# Example data
n=24
dateindex = pd.date_range(pd.datetime(2018, 1, 1), periods=n)
np.random.seed(1)
aa = np.random.randn(n)
np.random.seed(2)
bb = np.random.randn(n)
np.random.seed(3)
cc = np.random.randn(n)
df = pd.DataFrame({'AA': aa, 'BB': bb, 'CC': cc}, index=dateindex)

# Non-stacked bar plot
df.plot.bar(figsize=(16, 6))

plt.title("Count by Networks")
plt.legend(title="Network")
plt.show()

【讨论】:

  • 谢谢,这太好了,我注意到我遇到的一个问题是,如果我有 5 个条而不是 3 个,我在移动它们时会遇到麻烦,而第一个条不重叠,除非我缩小了条的宽度。最终通过这样做width = 0.19 plt.bar(np.arange(len(aa))-(width*2),y.values,width, label=“aa”) plt.bar(np.arange(len(bb))-width,y2.values,width, label=“bb”) plt.bar(np.arange(len(cc)),y3.values,width, label=“cc”) plt.bar(np.arange(len(dd))+width,y4,width,label=“dd”) plt.bar(np.arange(len(ee))+width*2,y4,width,label=“ee”)让它工作有没有更好的调整方法?这会起作用的!
  • 想使用 pandas。我认为它对我不起作用,因为我正在尝试制作 aa = df['count'] ,例如aa=df1[‘count’] bb=df2[‘count’] cc=df3[‘count’] dfbar = pd.DataFrame({'AA': aa, 'BB': bb, 'CC': cc}, index=dateindex) 如何使用我的源数据正确地将我的值放入 aa/bb/cc 是 a 中的一列数据框?谢谢
  • 对于您的第一条评论,我不太确定您所说的“更好”是什么意思。如果您想自动执行此操作,我认为最好的方法是 ImportanceOfBeingErnest 的建议,即像您在第二条评论中所做的那样使用 Pandas。它可以节省您自己编写调整算法的时间。如果你想让它更漂亮,我真的不知道除了做一个更宽的图之外,因为空间有限。
  • 对于您的第二条评论,我建议this。我不能在这里放太多代码。但是如果索引是一致的,它可以是pd.concat([df1, df2, df3], axis=1)
  • 这样做了! aa=dict(zip(x,df1['count'])) bb=dict(zip(x,df2['count']])) cc=dict(zip(x,df3['count'])) dd=dict(zip(x,df4['count']])) ee=dict(zip(x,df5['count'])) 其中 x 是 df['date'] 我也会尝试使用 pd.concat,谢谢!
猜你喜欢
  • 2021-01-16
  • 1970-01-01
  • 2018-11-29
  • 2018-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-01
  • 2020-08-24
相关资源
最近更新 更多