我当前的数据框如下:
a b c d e
in_1 | in_2 |
--------|-----------------------------------
car | bmw 2 4 5 34 46
| merc 23 4 55 64 21
| range 453 32 2 56 21
| lambo 4 6 2 5 12
| ferrari 12 46 34 23 642
fastfood| burger 123 34 213 23 234
| kfc 123 34 235 123 24
| tacoBell 213 432 124 12 1
我正在尝试为每个'in_1'绘制一个子图,其中x轴是列名(a,b,c,d,e),而y轴是计数(细胞)。
因此,第一个子图将具有标题“ car”。 x轴将具有“ a”,“ b”,“ c”,“ d”,“ e”。 y轴将包含“ bmw”,“ merc”,“ range”,“ lambo”,“ ferrari”中每个的计数。
子图可以是条形图或折线图,in_2的值可以用图例形式表示。
答案 0 :(得分:1)
所以我想你可以做这样的事情:
import numpy as np
import matplotlib.pyplot as plt
ng = 5 #number of groups
bmw = ..
merc = ..
..
fig, ax = plt.subplots()
index = np.arrange(ng)
bar_width = 0.2
fbmw = ax.bar(index, bmw, bar_width, color='r', label='BMW')
fmerc = ax.bar(index + bar_width, merc, color='b', label='MERC')
...
#don't forget to increase bar_width everytime
ax.set_xlabel('Cars')
ax.set_ylabel('Whatever this is')
ax.set_xticks(index + bar_width/2)
ax.set_xticklabels(('a', 'b', 'c', 'd', 'e'))
ax.legend()
fig.tight_layout()
由于我不知道a,b,c,d,e的数字和列是什么,所以我将这些标签留为空白。我还以为你已经有了宝马,默克等的数据框,所以我没有导入它们。希望这会有所帮助!
答案 1 :(得分:0)
您可以使用一个简单的循环来拾取所有列并将它们分配给一个轴。它还将创建一个子图,其行数由in_1
中的唯一值确定。
请注意,它假定您具有一个以in_1
和in_2
作为索引值的多重索引df。
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
n = len(df.columns)
rows = df.index.get_level_values('in_1').unique()
index = np.arange(n)
fig, axs = plt.subplots(len(rows),1,figsize=(15,10))
width = 0.2
colors=["#e08283", "#52b3d9", "#fde3a7", "#3fc380"]
for i in range(len(rows)):
intdf = df[df.index.get_level_values('in_1') == rows[i]]
offset = 0
for j in range(len(intdf.index.get_level_values('in_2'))):
v = intdf.iloc[j,].values
axs[i].bar(index + offset, v, width,
label=intdf.index.get_level_values('in_2')[j], color=colors[j])
offset += width
axs[i].set_xlabel(rows[i])
axs[i].set_xticks(index + width)
axs[i].set_xticklabels(tuple(df.columns))
axs[i].legend(loc=2)
plt.show()
这是输出。
提醒一下,可以找到更多信息here