Python 基于dataframe中的列创建6条子图
我有一个条形图,看起来有点像这样: 我希望根据我的数据框Python 基于dataframe中的列创建6条子图,python,pandas,dataframe,matplotlib,plot,Python,Pandas,Dataframe,Matplotlib,Plot,我有一个条形图,看起来有点像这样: 我希望根据我的数据框dat的列制作六个不同的条形图(每个“季节”一个,例如MAM 16) import pandas as pd import numpy as np import matplotlib.pyplot as plt labels = {'pod','MAM-16', 'MAM-17', 'JJAS-16', 'JJAS-17', 'OND-15','OND-16'} rf = [('22','343.7','467.4', '157',
dat
的列制作六个不同的条形图(每个“季节”一个,例如MAM 16)
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
labels = {'pod','MAM-16', 'MAM-17', 'JJAS-16', 'JJAS-17', 'OND-15','OND-16'}
rf = [('22','343.7','467.4', '157', '251', '100','142.5'),
('72', '82', '184.4', '143.3', '12.7', '120', '152.4'),
('79', '76.5', '167.4', '118.1', '185.4', '190', '145'),
('86', '993.4', '66.5', '198.9', '14', '78', '84.8'),
('87', '206.2', '178.1', '121.4', '285.2', '89' ,'65'),
('88', '209.3', '280.4', '138.4', '279.9', '84', '141'),
('90' , '134.9', '137.9', '92.7', '224', '111', '133.1'),
('93', '180.8', '113.8', '179.6', '108.2', '184', '211.8'),
('95', '329.7', '176.5', '168.9', '64', '75','103.6'),
('96', '270.5', '158.5', '196.6', '363', '128','152.4'),
('97', '167.9', '103.1', '184.4', '117.1', '132', '104.1'),
dat = pd.DataFrame.from_records(rf, columns=labels); dat
dat
中的第一列表示不同的ID,它是上图中的彩色条,不是数字。其余的值是数值
我知道我可以用这样的方法将所有值绘制在一起:
ax = dat.plot(kind='bar',rot=0,lw=2,colormap='jet',figsize=(10,4),
title='Sample title')
x1 = [0,1,2,3,4,5]
labels = ['MAM 16', 'MAM 17', 'JJAS 16','JJAS 17', 'OND 15','OND 16']
ax1.set_xticks(x1)
ax1.set_xticklabels(labels, minor=False, rotation=45)
ax.set_xticklabels(labels)
plt.show()
要获得子图,我想我可以使用for循环:
for col in dat:
fig = plt.figure(figsize=(5.0, 6.0))
axes1 = fig.add_subplot(3, 2, 1)
axes2 = fig.add_subplot(3, 2, 2)
axes3 = fig.add_subplot(3, 2, 3)
axes1.set_ylabel('rainfall / mm')
axes1.plot(???)
axes2.set_ylabel('total rainfall / mm')
axes2.plot(???)
axes3.set_ylabel('total rainfall / mm')
axes3.plot(???)
fig.tight_layout()
plt.show()
结果应该是一个2x3的子图矩阵,上面图像(图1)中的每组条形图都是自己的图 要使用绘图函数的
subplot=True
和layout
参数。这允许获得绘图的子地块网格
下面是一个可运行的示例(我用一些有用的东西替换了字符串“mean”和“var”)
要以不同的方式设置条形图的颜色,需要手动设置它们
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
labels = {'pod','MAM-16', 'MAM-17', 'JJAS-16', 'JJAS-17', 'OND-15','OND-16'}
rf = [('22','343.7','467.4', '157', '251', '100','142.5'),
('72', '82', '184.4', '143.3', '12.7', '120', '152.4'),
('79', '76.5', '167.4', '118.1', '185.4', '190', '145'),
('86', '993.4', '66.5', '198.9', '14', '78', '84.8'),
('87', '206.2', '178.1', '121.4', '285.2', '89' ,'65'),
('88', '209.3', '280.4', '138.4', '279.9', '84', '141'),
('90' , '134.9', '137.9', '92.7', '224', '111', '133.1'),
('93', '180.8', '113.8', '179.6', '108.2', '184', '211.8'),
('95', '329.7', '176.5', '168.9', '64', '75','103.6'),
('96', '270.5', '158.5', '196.6', '363', '128','152.4'),
('97', '167.9', '103.1', '184.4', '117.1', '132', '104.1'),
('98', '394', '204.6', '53.6', '332.5', '85', '103.4'),
('99', '243', '103.6', '33.2', '112.5', '25', '37.9')]
dat = pd.DataFrame.from_records(rf, columns=labels).astype(float)
labels = ['MAM 16', 'MAM 17', 'JJAS 16','JJAS 17', 'OND 15','OND 16']
dat = dat[['MAM-16', 'MAM-17', 'JJAS-16', 'JJAS-17', 'OND-15','OND-16']]
axes = dat.plot(kind='bar',rot=0,lw=2, figsize=(10,4), legend=False,
title='Sample title', subplots=True, layout=(3,2))
colors = plt.cm.jet(np.linspace(0,1,len(dat)))
for ax in axes.flat:
for i,bar in enumerate(ax.patches):
bar.set_color(colors[i])
plt.show()
什么是
“平均值”
和“变量”
以及它们为什么在数据框列中?请阅读。数据框完全是字符串?它应该是数字的,对吗?@Bharath嗯,除了第一个之外,所有的值都是数字。每行中的第一个值是ID,例如,22
或其均值和方差。@importantanceofbeingernest也许我之前的评论也回答了您的问题。您正在使用fig.add_子地块(nrows,ncosl,axe_num)
创建新轴,但在您的示例中,图形最多有两个子地块(1行,2列)。因此fig.add_子批次(1、2、3)
将不起作用(您所参考的子批次编号高于子批次总数)。此外,在对列进行迭代时要小心,因为数据帧中有7列,但显然您只想创建6(2x3)个子图。Hi@ImportanceOfBeingErnest唯一的修改是,我希望每个图中的每个列都是不同的颜色。不幸的是,这只能通过手动设置条的颜色来实现。看升级版。适合我!谢谢
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
labels = {'pod','MAM-16', 'MAM-17', 'JJAS-16', 'JJAS-17', 'OND-15','OND-16'}
rf = [('22','343.7','467.4', '157', '251', '100','142.5'),
('72', '82', '184.4', '143.3', '12.7', '120', '152.4'),
('79', '76.5', '167.4', '118.1', '185.4', '190', '145'),
('86', '993.4', '66.5', '198.9', '14', '78', '84.8'),
('87', '206.2', '178.1', '121.4', '285.2', '89' ,'65'),
('88', '209.3', '280.4', '138.4', '279.9', '84', '141'),
('90' , '134.9', '137.9', '92.7', '224', '111', '133.1'),
('93', '180.8', '113.8', '179.6', '108.2', '184', '211.8'),
('95', '329.7', '176.5', '168.9', '64', '75','103.6'),
('96', '270.5', '158.5', '196.6', '363', '128','152.4'),
('97', '167.9', '103.1', '184.4', '117.1', '132', '104.1'),
('98', '394', '204.6', '53.6', '332.5', '85', '103.4'),
('99', '243', '103.6', '33.2', '112.5', '25', '37.9')]
dat = pd.DataFrame.from_records(rf, columns=labels).astype(float)
labels = ['MAM 16', 'MAM 17', 'JJAS 16','JJAS 17', 'OND 15','OND 16']
dat = dat[['MAM-16', 'MAM-17', 'JJAS-16', 'JJAS-17', 'OND-15','OND-16']]
axes = dat.plot(kind='bar',rot=0,lw=2, figsize=(10,4), legend=False,
title='Sample title', subplots=True, layout=(3,2))
colors = plt.cm.jet(np.linspace(0,1,len(dat)))
for ax in axes.flat:
for i,bar in enumerate(ax.patches):
bar.set_color(colors[i])
plt.show()