Neo*_*Neo 4 python matplotlib bar-chart pie-chart seaborn
I'm trying to plot a pandas data frame on two plots. One with a pie chart of matplotlib pyplot and the other with seaborn barchart. On each chart, I sorted the data frame but based on a different column. Also, each chart is representative of the respective value which data frame is sorted by. So, the order of rows is different in the two charts. This way, same indexes(or category) in data frame appears with different color on charts which is confusing. How can I fix this in order to have indexes with the same color on different charts?
My code:
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()
Run Code Online (Sandbox Code Playgroud)
For example, 1.1.15200.1 has blue color in pie chart but in bar chart its color is orange.
您必须制作一个字典,为您正在使用的标签值查找适当的颜色。以下是一个简化版本,希望涵盖您对数据所做的所有事情:
# 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])
Run Code Online (Sandbox Code Playgroud)
这是我得到的输出。下排的颜色不是标注的颜色,但是是一致的。(另外,请注意,我在这里为两个图都使用了 matplotlib)
| 归档时间: |
|
| 查看次数: |
2796 次 |
| 最近记录: |