#matplotlib #seaborn
#matplotlib #seaborn
Вопрос:
Я бы хотел, чтобы цвет столбцов определялся их значением по оси x, например, столбцам с одинаковыми значениями по оси x должны быть присвоены одинаковые цвета.
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
df = pd.DataFrame(index=['A','B','C','D','E','F'],data={'col1':np.array([2.3423,4.435,9.234,9.234,2.456,6.435])})
ax = sns.barplot(x='col1', y=df.index.values, data=df,palette='magma')
Вот как это выглядит на данный момент с настройками по умолчанию. Я полагаю, что есть простой элегантный способ сделать это, но заинтересован в любом решении.
Комментарии:
1. Вы пытались указать оттенок? Он же добавление
hue='col1'
в качестве аргументаsns.barplot
.2. это не исправляет
Ответ №1:
Вот решение:
import seaborn as sns
import matplotlib as mpl, matplotlib.pyplot as plt
import numpy as np
import pandas as pd
df = pd.DataFrame(index=['A','B','C','D','E','F'],
data={'col1':np.array([2.3423,4.435,9.234,9.234,2.456,6.435])})
ax = sns.barplot(x='col1', y=df.index.values, data=df,
palette=mpl.cm.magma(df['col1']*.1))
Примечание: mpl.cm.magma
является Colormap
экземпляром и используется для преобразования значений данных (с плавающей запятой) из интервала [0, 1] в цвета, которые Colormap
представляет. Если вы хотите «автоматическое масштабирование» ваших значений данных, вы можете использовать palette=mpl.cm.ScalarMappable(cmap='magma').to_rgba(df['col1'])
вместо этого в sns.barplot()
вызове.
Комментарии:
1. Вы должны использовать объект matplotlib normalize, чтобы избежать ручного указания скалярного коэффициента здесь.
2. @mwaskom,
ScalarMappable
вариант, который я предложил в своей заметкеNormalize
, автоматически использует объект, см. Документы . Однако в версии, заданной вручную, цвета выглядели красивее. 🙂3. Упс, извините, полностью пропустил абзац после кода!
4. PS:
Normalize
версия на основе a будет:palette=mpl.cm.magma(mpl.colors.Normalize()(df['col1']))
. Не включил это в ответ, поскольку двух вариантов показалось достаточно.