Вам нужен so_sample.parquet для запуска кода
Мне нужно воспроизвести этот гистограмму на графике и, что наиболее важно, иметь возможность предварительно выбирать цвета случайным образом таким же образом.
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
df = pd.read_parquet('so_sample.parquet')
df = df.groupby(['col1', 'col2']).size().unstack().fillna(0)
df.plot(
kind='bar',
stacked=True,
legend=False,
xlabel='',
rot=0,
color=np.random.uniform(0, 1, (df.shape[1], 3)),
)
Вот что я сделал до сих пор:
import plotly.express as px
df = pd.read_parquet('so_sample.parquet')
df = df.groupby(['col1', 'col2']).size().reset_index(name='count')
px.bar(
df,
x='col1',
y='count',
color='col2',
).show()
Я пробовал пройти color_discrete_sequence=[color1, color2, ...]
, и это не имеет никакого значения.
Формат данных, используемый в matplotlib, является широким форматом, но в графике это длинный формат. plotly должен быть такого же широкого формата, и вы можете указать свою любимую палитру. Я выбрал Dark24, в котором большое количество цветов.
import plotly.express as px
import pandas as pd
df = pd.read_parquet('./data/so_sample.parquet')
#df = df.groupby(['col1', 'col2']).size().reset_index(name='count')
df = df.groupby(['col1', 'col2']).size().unstack().fillna(0)
px.bar(
df,
x=df.index,
y=df.columns.tolist(),
color_discrete_sequence=px.colors.qualitative.Dark24,
).show()
Цвета и имена столбцов показаны в легенде, но что еще вы имеете в виду?
Мне нужно иметь список цветов отдельно, чтобы я мог повторно использовать его позже в другом месте. Кроме того, легенда усечена, поэтому она должна быть на отдельном рисунке или не отображаться, если это будет хлопотно / нет прямого способа сделать это.
Цветов, естественно, 24, поэтому, если цветов больше 24, процесс будет повторяться. Здесь используются следующие цвета. ['#2E91E5', '#E15F99', '#1CA71C', '#FB0D0D', '#DA16FF', '#222A2A', '#B68100', '#750D86', '#EB663B', '#511CFB', '#00A08B', '#FB00D1', '#FC0080', '#B2828D', '#6C7C32', '#778AAE', '#862A16', '#A777F1', '#620042', '#1616A7', '#DA60CA', '#6C4516', '#0D2A63', '#AF0038']
print(px.colors.qualitative.Dark24)
Теперь вы можете получить его.
Я знаю, и я проверил их сразу после того, как вы опубликовали свой ответ, повторение вводит в заблуждение, и, как я указал в вопросе, мне нужно предварительно выбрать цвета или каким-то образом иметь 99 разных цветов.
Затем я сгенерирую случайные шестнадцатеричные цвета вместо px.colors, я думаю, это решит проблему, неважно, тогда, спасибо.
У меня нет списка из 99 цветов, поэтому я не могу попробовать, но в справке сказано, что это список букв, так что это возможно. Пожалуйста, попробуйте это для сюжетных пользователей.
Еще раз спасибо, вместо этого я буду генерировать случайные шестнадцатеричные значения, которые должны решить проблему.
Мне нужно либо знать, какие цвета были присвоены каким значениям в
df.columns
, либо иметь возможность указывать цвета так же, как в matplotlib. Кроме того, кажется, что цвета повторяются, так как верхний стек (зеленый) имеет значение-136
в легенде, а его фактическое значение — какое-то 7-значное число, что означает, что в стеке есть еще один зеленый (то же самое происходит с matplotlib , но мне это не нравится)