Поддерживать одинаковый порядок цветов для линий между разными участками? Я опустил одну строку, цвета теперь переставлены - PullRequest
1 голос
/ 30 апреля 2020

У меня есть pandas фрейм данных, и я хотел бы сравнить два линейных графика или график "спагетти". На втором графике один столбец удален из кадра данных.

Однако, когда цвета меняются между участками, становится немного странно.

Например, еженедельные продажи восьми магазинов:

(df.plot(figsize=(20,10),lw=2.5,linestyle='--')
 .legend(loc=2, prop={'size': 13}))

enter image description here

Я вижу, что shop1 (синий) заглушает остальных. Поэтому я решил удалить shop1 и построить его снова:

# drop shop 1
df.drop('shop1',axis=1,inplace=True)

# plot again
(df.plot(figsize=(20,10),lw=2.5,linestyle='--')
 .legend(loc=2, prop={'size': 13}))

enter image description here

Теперь цвета переставили сами. Shop2 был оранжевым, а теперь зеленым. Все цвета были сдвинуты.

Существует ли простой способ сохранения цветов для каждого магазина между графиками?

Я целый час тестировал разные способы обойти это. Используя pop, чтобы избавиться от линейных объектов, пытаясь взломать matplotlib color_cycle, я даже попытался скрыть строку, установив значения в ноль с белым цветом.

Пример кадра данных, для pd.DataFrame.from_dict():

df.to_dict()

{'shop1': {'2020-01-06': 9778.763579802846,
  '2020-01-13': 10294.040674742606,
  '2020-01-20': 10748.72889467783,
  '2020-01-27': 9995.956972783448,
  '2020-02-03': 11013.304192764444,
  '2020-02-10': 13165.999999999907,
  '2020-02-17': 11180.50000000096,
  '2020-02-24': 9194.999999999407,
  '2020-03-02': 12942.178556189565,
  '2020-03-09': 12676.000000003925,
  '2020-03-16': 9839.000000000065,
  '2020-03-23': 10872.386525901276,
  '2020-03-30': 11594.242224694048},
 'shop2': {'2020-01-06': 21235.830898431894,
  '2020-01-13': 21031.1531947192,
  '2020-01-20': 21007.500000000087,
  '2020-01-27': 22533.000000009146,
  '2020-02-03': 24665.31329061354,
  '2020-02-10': 23669.18106510104,
  '2020-02-17': 21559.90374194961,
  '2020-02-24': 21096.769732574685,
  '2020-03-02': 22949.18097357484,
  '2020-03-09': 26167.931841454425,
  '2020-03-16': 31657.999999966796,
  '2020-03-23': 23706.24281903446,
  '2020-03-30': 22218.329375006986},
 'shop3': {'2020-01-06': 150580.18064739247,
  '2020-01-13': 171580.040557476,
  '2020-01-20': 198202.9999999497,
  '2020-01-27': 200059.80313551775,
  '2020-02-03': 207317.58264445866,
  '2020-02-10': 215898.51182939706,
  '2020-02-17': 220737.15944472587,
  '2020-02-24': 227932.5231698131,
  '2020-03-02': 237088.36782405066,
  '2020-03-09': 261823.35184683453,
  '2020-03-16': 301458.9999998379,
  '2020-03-23': 278815.551154112,
  '2020-03-30': 272998.0208560584}}

1 Ответ

1 голос
/ 30 апреля 2020

Вы можете создать список цветов, а затем использовать параметр colormap в df.plot

from matplotlib.colors import LinearSegmentedColormap
# create a color list in the order of your shops
colors = ['r','g','b']
# create a custom color map
lscm = LinearSegmentedColormap.from_list('color', colors)

# plot 
(df.plot(figsize=(20,10),lw=2.5,linestyle='--', colormap=lscm)
 .legend(loc=2, prop={'size': 13}))

Если вы хотите создать только один ключ для всех кадров, вы можете сжать цвета в столбцах и используйте эту подсказку, чтобы отобразить каждый цвет в столбцы

colors = ['r','g','b']
# zip the colors to your columns
colordict = dict(zip(df.columns, colors))
# map colors from colordict whatever dataframe you want
cmap = df.columns.map(colordict).values.tolist()
# then assign to lscm
lscm = LinearSegmentedColormap.from_list('color', cmap)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...