我创建了一个假设的DataFrame,包含20个实验的3个测量值。每个实验都与一个主题相关(3种可能性)。
import random
random.seed(42) #set seed
tuples = list(zip(*[list(range(20)),random.choices(['Jean','Marc','Paul'], k = 20)]))#index labels
index=pd.MultiIndex.from_tuples(tuples, names=['num_exp','Subject'])#index
test= pd.DataFrame(np.random.randint(0,100,size=(20, 3)),index=index,columns=['var1','var2','var3']) #DataFrame
test.head() #first lines我成功地为每个主题构建了三种度量(每条都是一个实验)的堆叠条形图:
test.groupby('Subject').plot(kind='bar', stacked=True,legend=False) #plots现在,我想把每一个情节(每一个主题)放在一个子图中。如果我使用“子图”参数,它将给出以下内容:
test.groupby('Subject').plot(kind='bar', stacked=True,legend=False,subplots= True) #plot with subplotplotsubplot1 plotsubplot2 plotsubplot3
它为每个度量创建了一个子图,因为它们对应于我的DataFrame中的列。我不知道如何才能不这样做,因为我需要它们作为列来创建堆叠的栏。
因此,我的问题是:是否有可能在子图中用叠加的条形图来构造这种图形(最好是以一种优雅的方式,不需要迭代)?
提前谢谢!
发布于 2022-05-28 11:35:06
我用一个简单的循环解决了我的问题,除了熊猫.plot()
熊猫.plot()具有matplotlib轴对象的ax参数。
因此,从一系列不同的主题开始:
subj= list(dict.fromkeys(test.index.get_level_values('Subject')))我定义了我的子情节:
fig, axs = plt.subplots(1, len(subj))然后,我必须对每个子图进行迭代:
for a in range(len(subj)):
test.loc[test.index.get_level_values('Subject') == subj[a]].unstack(level=1).plot(ax= axs[a], kind='bar', stacked=True,legend=False,xlabel='',fontsize=10) #Plot
axs[a].set_title(subj[a],pad=0,fontsize=15) #title
axs[a].tick_params(axis='y', pad=0,size=1) #yticks它运行得很好!:终结果
https://stackoverflow.com/questions/72126072
复制相似问题