pandas опция построения графика и использование определенной цветовой карты - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть датафрейм, и я хочу создать сложный график. Команда, которую я использую:

df1 = df.groupby(['sample', 'species']).size().groupby(level=0).apply(lambda x: 100 * x / x.sum()).unstack()
df1.plot(kind='bar', stacked=True, colormap=cmap, ax=f.gca())

Сюжет выглядит хорошо, но я бы хотел всегда использовать один и тот же цвет для одного и того же вида из другого набора данных. Для этого я создаю таблицу, в которой связываю имя speceis с цветом RGB. однако я не могу связать название вида на участке с цветом.

Как я могу это сделать? кто-нибудь может помочь, пожалуйста?

1 Ответ

0 голосов
/ 05 февраля 2020

Возможный подход - включить все значения species в каждый набор данных. Таким образом pandas сделает все ссылки автоматически. Требуется 2 шага - следите за комментариями. Надеюсь, что это близко к вашим ожиданиям.

import matplotlib.pyplot as plt
import pandas as pd
import random

num = 100

df1 = pd.DataFrame({
    'sample': [random.randrange(10) for dummy in range(num)],
    'species': [random.choice('abcdi') for dummy in range(num)]})
dfg1 = (
      df1
      .groupby(['sample', 'species'])
      .size()
      .groupby(level=0)
      .apply(lambda x: 100 * x / x.sum()).unstack())

df2 = pd.DataFrame({
    'sample': [random.randrange(10) for dummy in range(num)],
    'species': [random.choice('defghi') for dummy in range(num)]})
dfg2 = (
      df2
      .groupby(['sample', 'species'])
      .size()
      .groupby(level=0)
      .apply(lambda x: 100 * x / x.sum()).unstack())

# step 1 - get all values of species
all_columns = set(dfg1.columns) | set(dfg2.columns)

# step 2 - add all species to every dataset
for dfg in [dfg1, dfg2]:
    for col in all_columns.difference(set(dfg.columns)):
        dfg[col] = 0  # zeros for all added species
        dfg.sort_index(axis=1, inplace=True)  # sort columns of every dataset

plt.figure()
ax1 = plt.subplot(121)
ax1.set_title('data_1')
dfg1.plot(kind='bar', stacked=True, ax=ax1, cmap='rainbow')
ax2 = plt.subplot(122)
ax2.set_title('data_2')
dfg2.plot(kind='bar', stacked=True, ax=ax2, cmap='rainbow')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...