Проблема с использованием set_prop_cycle для стилизации фигур в matplotlib — Цвета не выполняются

#python #pandas #matplotlib

Вопрос:

Я создаю столбчатую диаграмму со стеком и стилизую ее с помощью set_prop_cycle, потому что с 15 различными элементами использование обычного стиля набора привело к повторению цветов. Например, зима и ураган теперь одного цвета, чего я хочу избежать.

Я знаю, что есть также способ создать цикл вместо библиотеки, но не уверен, как это сделать.

Это мой текущий код :

 import numpy as np
import matplotlib.pyplot as plt 
import pandas as pd 
import seaborn as sns 
import matplotlib.cm as mplcm
from cycler import cycler


yearly_tcount = pd.read_pickle('yearly_tcount.pkl')
yearly_tcount=yearly_tcount.reset_index()
yearly_tcount = yearly_tcount.drop(labels = [0, 1], axis=0 )


yearly_tcount.columns = ['Start_year', 'Disaster_Type','Event_Count']


types = ['Flood', 'Drought', 'Earthquake', 'Hurricane', 'Storm', 'Tornado',
       'Typhoon', 'Fire', 'Ice']


fig, ax = plt.subplots(figsize=(12,8))

cy = cycler('color', [
    '#1f77b4', '#aec7e8', '#ff7f0e', '#ffbb78', '#2ca02c', '#98df8a',
    '#d62728', '#ff9896', '#9467bd', '#c5b0d5', '#8c564b', '#c49c94',
    '#e377c2', '#f7b6d2', '#7f7f7f'
    ])


yearly_tcount.pivot(index='Start_year', columns = 'Disaster_Type', values='Event_Count' ).plot.bar(stacked=True, ax=ax, zorder=3,)
ax.legend(ncol=3, edgecolor='w')
[ax.spines[s].set_visible(False) for s in ['top','right', 'left']]
ax.tick_params(axis='both', left=False, bottom=False)

ax.set_prop_cycle(cy)

ax.grid(axis='y', dashes=(8,3), color='grey', alpha=0.3)

fig.savefig('Change_in_Type_of_Winter_Weather_Events')

 

введите описание изображения здесь

Ответ №1:

Поскольку циклер представляет собой повторение 10 цветов, если вы зададите произвольное количество цветов на цветовой карте, он будет классифицирован по этим цветам. Я использую plotly для данных, чтобы вы могли заменить их своими собственными данными.

 import plotly.express as px
data = px.data.gapminder()

europe = data[data.continent == 'Europe']
europe_top15 = europe.groupby('country')['pop'].last().sort_values(ascending=False).head(15)
euro = europe_top15.index.tolist()

df = europe[europe['country'].isin(euro)]

import numpy as np
import matplotlib.pyplot as plt 
import pandas as pd 
from matplotlib.colors import ListedColormap

fig, ax = plt.subplots(figsize=(12,8))

colors = ['#1f77b4', '#aec7e8', '#ff7f0e', '#ffbb78', '#2ca02c', '#98df8a',
          '#d62728', '#ff9896', '#9467bd', '#c5b0d5', '#8c564b', '#c49c94',
          '#e377c2', '#f7b6d2', '#7f7f7f'
         ]
cmap = ListedColormap(colors, name="custom")

df.pivot(index='year', columns = 'country', values='pop' ).plot.bar(stacked=True, ax=ax, zorder=3, cmap=cmap)
ax.legend(ncol=3, edgecolor='w')
[ax.spines[s].set_visible(False) for s in ['top','right', 'left']]
ax.tick_params(axis='both', left=False, bottom=False)

ax.grid(axis='y', dashes=(8,3), color='grey', alpha=0.3)

fig.savefig('Change_in_Type_of_Winter_Weather_Events')
 

введите описание изображения здесь