为了账号安全,请及时绑定邮箱和手机立即绑定

python matplotlib多个栏

/ 猿问

python matplotlib多个栏

尚方宝剑之说 2019-11-12 10:25:33

如何在matplotlib中绘制多个条形图,当我尝试多次调用bar函数时,它们重叠了,如下图所示,只能看到最高的红色。如何在X轴上绘制带有日期的多个条形图?


到目前为止,我已经尝试过了:


import matplotlib.pyplot as plt

import datetime


x = [

    datetime.datetime(2011, 1, 4, 0, 0),

    datetime.datetime(2011, 1, 5, 0, 0),

    datetime.datetime(2011, 1, 6, 0, 0)

]

y = [4, 9, 2]

z = [1, 2, 3]

k = [11, 12, 13]


ax = plt.subplot(111)

ax.bar(x, y, width=0.5, color='b', align='center')

ax.bar(x, z, width=0.5, color='g', align='center')

ax.bar(x, k, width=0.5, color='r', align='center')

ax.xaxis_date()


plt.show()


查看完整描述

3 回答

?
桃花长相依

import matplotlib.pyplot as plt

from matplotlib.dates import date2num

import datetime


x = [

    datetime.datetime(2011, 1, 4, 0, 0),

    datetime.datetime(2011, 1, 5, 0, 0),

    datetime.datetime(2011, 1, 6, 0, 0)

]

x = date2num(x)


y = [4, 9, 2]

z = [1, 2, 3]

k = [11, 12, 13]


ax = plt.subplot(111)

ax.bar(x-0.2, y, width=0.2, color='b', align='center')

ax.bar(x, z, width=0.2, color='g', align='center')

ax.bar(x+0.2, k, width=0.2, color='r', align='center')

ax.xaxis_date()


plt.show()


我不知道“ y值也重叠”是什么意思,以下代码可以解决您的问题吗?


ax = plt.subplot(111)

w = 0.3

ax.bar(x-w, y, width=w, color='b', align='center')

ax.bar(x, z, width=w, color='g', align='center')

ax.bar(x+w, k, width=w, color='r', align='center')

ax.xaxis_date()

ax.autoscale(tight=True)


plt.show()


查看完整回答
反对 回复 2019-11-12
?
蛊毒传说

使用日期作为x值的麻烦在于,如果您想要第二张图片所示的条形图,则它们将是错误的。您应该使用堆叠的条形图(彼此之间的颜色)或按日期分组(x轴上的“假”日期,基本上只是将数据点分组)。


import numpy as np

import matplotlib.pyplot as plt


N = 3

ind = np.arange(N)  # the x locations for the groups

width = 0.27       # the width of the bars


fig = plt.figure()

ax = fig.add_subplot(111)


yvals = [4, 9, 2]

rects1 = ax.bar(ind, yvals, width, color='r')

zvals = [1,2,3]

rects2 = ax.bar(ind+width, zvals, width, color='g')

kvals = [11,12,13]

rects3 = ax.bar(ind+width*2, kvals, width, color='b')


ax.set_ylabel('Scores')

ax.set_xticks(ind+width)

ax.set_xticklabels( ('2011-Jan-4', '2011-Jan-5', '2011-Jan-6') )

ax.legend( (rects1[0], rects2[0], rects3[0]), ('y', 'z', 'k') )


def autolabel(rects):

    for rect in rects:

        h = rect.get_height()

        ax.text(rect.get_x()+rect.get_width()/2., 1.05*h, '%d'%int(h),

                ha='center', va='bottom')


autolabel(rects1)

autolabel(rects2)

autolabel(rects3)


plt.show()


查看完整回答
反对 回复 2019-11-12
?
翻阅古今

我知道这是关于matplotlib,但是使用pandas和seaborn可以节省很多时间:


df = pd.DataFrame(zip(x*3, ["y"]*3+["z"]*3+["k"]*3, y+z+k), columns=["time", "kind", "data"])

plt.figure(figsize=(10, 6))

sns.barplot(x="time", hue="kind", y="data", data=df)

plt.show()


查看完整回答
反对 回复 2019-11-12

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信