How to set same colors for same indexes in different charts in matplotlib and seaborn
我正在尝试在两个图中绘制一个熊猫数据框。 一个带有matplotlib pyplot饼图,另一个带有seaborn barchart。 在每个图表上,我都根据不同的列对数据框进行了排序。 同样,每个图表代表对数据帧进行排序的相应值。 因此,两个图表中的行顺序不同。 这样,数据框中的相同索引(或类别)在图表上以不同的颜色显示,这令人困惑。 如何解决此问题,以使索引在不同图表上具有相同的颜色?
我的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | df = pd.DataFrame({"Total":totals,"Infected": infected}, index=category).sort_values("Total", ascending=False) fig, ax = plt.subplots(ncols=2, nrows=1,figsize=(20,8)) #creating a pie chart with conditional explode option threshold = new_train.shape[0]*threshold if explode==-1: ax[0].pie(df[df["Total"]>threshold]["Total"], labels=df[df["Total"]>threshold].index.values, autopct='%1.1f%%',shadow=False, startangle=rotation, textprops={'fontsize': 15}) else: ax[0].pie(df[df["Total"]>threshold]["Total"], labels=df[df["Total"]>threshold].index.values, autopct='%1.1f%%',shadow=False, startangle=rotation, textprops={'fontsize': 15}, explode=explode) ax[0].axis('equal') ax[0].set_title(col_name) #created a sorted bar chart newdf = df[df["Total"]>threshold] newdf.sort_values("Infected", ascending=False, inplace=True) ax[1].set_xticklabels(category,rotation=45, horizontalalignment='right') ax[1].set_title('Infected fractions') ax[1] = sns.barplot(x=newdf.index, y="Infected",data=newdf, order=newdf.index)#, orient='h') plt.show() |
例如,1.1.15200.1在饼图中具有蓝色,而在条形图中,其颜色是橙色。
您将必须制作一个字典,以查找所用标签值的适当颜色。 以下是简化版本,希望涵盖您对数据所做的所有操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | # a dataframe from a list of lists el = [['RED', 50, 1], ['GREEN', 30, 2], ['BLUE', 7, 3], ['YELLOW', 3, 4], ['ORANGE', 9, 5], ['BLACK', 1, 6]] df = pd.DataFrame(el) # since you are not using the entire dataframe df_thres = df[df[1] > 1] # make a fixed length color map manually c = ['red', 'green', 'blue', 'yellow', 'orange'] clist1 = {i:j for i, j in zip(df_thres[0].values, c)} # make an arbitrary-length colormap cm = plt.get_cmap('rainbow') c = [cm(1.0 * i/len(df_thres)) for i in range(len(df_thres))] clist2 = {i:j for i, j in zip(df_thres[0].values, c)} fig, ax = plt.subplots(nrows=2, ncols=2, figsize=(11, 8)) # manual colors # PIE PLOT: sort on the third column newdf = df_thres.sort_values(2, ascending=False) ax[0, 0].pie(newdf[2], labels=newdf[0], colors=[clist1[i] for i in newdf[0].values]) ax[0, 0].axis('square') # matplotlib 2.x only # BAR PLOT: sort on the second column newdf = df_thres.sort_values(1, ascending=False) ax[0, 1].bar(newdf[0], newdf[1], color=[clist1[i] for i in newdf[0].values]) #---------------- # arbitrary-length generated colorlist newdf = df_thres.sort_values(2, ascending=False) ax[1, 0].pie(newdf[1], labels=newdf[0], colors=[clist2[i] for i in newdf[0].values]) ax[1, 0].axis('square') # matplotlib 2.x only newdf = df_thres.sort_values(1, ascending=False) ax[1, 1].bar(newdf[0], newdf[1], color=[clist2[i] for i in newdf[0].values]) |
这是我得到的输出。 下一行的颜色不是标记的颜色,但它们是一致的。 (另外,请注意,我在这里将matplotlib用于两个图)