Как установить одинаковые цвета для одинаковых индексов на разных графиках в matplotlib и seaborn - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь построить фрейм данных панд на двух графиках. Один с круговой диаграммой пиплота matplotlib, а другой с диаграммой морского происхождения. На каждом графике я сортировал фрейм данных, но по другому столбцу. Кроме того, каждая диаграмма представляет соответствующее значение, по которому сортируется фрейм данных. Таким образом, порядок строк отличается на двух графиках. Таким образом, одни и те же индексы (или категории) во фрейме данных отображаются на диаграммах разным цветом, что приводит к путанице. Как это исправить, чтобы индексы одного цвета были на разных графиках?

Мой код:

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()

enter image description here

Например, 1.1.15200.1 имеет синий цвет на круговой диаграмме, а на столбчатой ​​диаграмме - оранжевый.

1 Ответ

0 голосов
/ 19 января 2019

Вам нужно будет создать словарь, который будет искать соответствующий цвет для значения метки, которую вы используете. Ниже приведена упрощенная версия, которая, надеюсь, охватывает все, что вы делаете со своими данными:

# 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 для обоих графиков здесь)

enter image description here

...