Я хочу понять, как сделать две вещи в Seaborn с использованием гистограммы для отображения значений, которые находятся в кадре данных, но не в графике
Я хочу отобразить значения одного поля в датафрейме и одновременно построить график другого поля. Например, ниже, я 'строю график 'чаевых', но я хотел бы поместить значение 'total_bill' по центру над каждым из баров (т.е. 325.88 над пятницей, 1778.40 над субботой и т.д.).
Есть ли способ масштабировать цвета баров, при этом наименьшее значение 'total_bill' будет иметь самый светлый цвет (в данном случае пятница), а наибольшее значение 'total_bill' - самый темный. Очевидно, что при масштабировании я бы придерживался одного цвета (т.е. синего).
Спасибо! Я'уверен, что это легко, но я'упускаю это...
Хотя я вижу, что другие считают, что это дубликат другой проблемы (или двух), я упускаю часть того, как использовать значение, которого нет на графике, в качестве основы для метки или затенения. Как, скажем, использовать total_bill в качестве основы. Извините, но я просто не могу понять это, основываясь на этих ответах..
Начиная со следующего кода,
import pandas as pd
import seaborn as sns
%matplotlib inline
df=pd.read_csv("https://raw.githubusercontent.com/wesm/pydata- book/master/ch08/tips.csv", sep=',')
groupedvalues=df.groupby('day').sum().reset_index()
g=sns.barplot(x='day',y='tip',data=groupedvalues)
я получаю следующий результат:
Промежуточное решение:
for index, row in groupedvalues.iterrows():
g.text(row.name,row.tip, round(row.total_bill,2), color='black', ha="center")
На затенение, используя пример ниже, я попробовал следующее:
import pandas as pd
import seaborn as sns
%matplotlib inline
df=pd.read_csv("https://raw.githubusercontent.com/wesm/pydata-book/master/ch08/tips.csv", sep=',')
groupedvalues=df.groupby('day').sum().reset_index()
pal = sns.color_palette("Greens_d", len(data))
rank = groupedvalues.argsort().argsort()
g=sns.barplot(x='day',y='tip',data=groupedvalues)
for index, row in groupedvalues.iterrows():
g.text(row.name,row.tip, round(row.total_bill,2), color='black', ha="center")
Но это дало мне следующую ошибку:
AttributeError: 'DataFrame' объект не имеет атрибута 'argsort'.
Поэтому я попробовал модификацию:
import pandas as pd
import seaborn as sns
%matplotlib inline
df=pd.read_csv("https://raw.githubusercontent.com/wesm/pydata-book/master/ch08/tips.csv", sep=',')
groupedvalues=df.groupby('day').sum().reset_index()
pal = sns.color_palette("Greens_d", len(data))
rank=groupedvalues['total_bill'].rank(ascending=True)
g=sns.barplot(x='day',y='tip',data=groupedvalues,palette=np.array(pal[::-1])[rank])
и это оставляет меня с
IndexError: index 4 is out of bounds for axis 0 with size 4
Давайте придерживаться решения из вопроса по ссылке (Changing color scale in seaborn bar plot). Вы хотите использовать argsort для определения порядка цветов, используемых для окраски столбцов. В связанном вопросе argsort применяется к объекту Series, что работает нормально, в то время как здесь у вас есть DataFrame. Поэтому вам нужно выбрать один столбец этого DataFrame для применения argsort.
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
df = sns.load_dataset("tips")
groupedvalues=df.groupby('day').sum().reset_index()
pal = sns.color_palette("Greens_d", len(groupedvalues))
rank = groupedvalues["total_bill"].argsort().argsort()
g=sns.barplot(x='day',y='tip',data=groupedvalues, palette=np.array(pal[::-1])[rank])
for index, row in groupedvalues.iterrows():
g.text(row.name,row.tip, round(row.total_bill,2), color='black', ha="center")
plt.show()
rank = groupedvalues['total_bill'].rank(ascending=True).values
rank = (rank-1).astype(np.int)
Работает с одной осью или с матрицей осей (подплоты).
from matplotlib import pyplot as plt
import numpy as np
def show_values_on_bars(axs):
def _show_on_single_plot(ax):
for p in ax.patches:
_x = p.get_x() + p.get_width() / 2
_y = p.get_y() + p.get_height()
value = '{:.2f}'.format(p.get_height())
ax.text(_x, _y, value, ha="center")
if isinstance(axs, np.ndarray):
for idx, ax in np.ndenumerate(axs):
_show_on_single_plot(ax)
else:
_show_on_single_plot(axs)
fig, ax = plt.subplots(1, 2)
show_values_on_bars(ax)
Надеюсь, это поможет в пункте №2: a) Вы можете отсортировать по общему счету, а затем сбросить индекс на этот столбец. b) Используйте palette="Blue", чтобы использовать этот цвет для масштабирования графика от светло-синего к темно-синему (если от темно-синего к светло-синему, то используйте palette="Blues_d").
import pandas as pd
import seaborn as sns
%matplotlib inline
df=pd.read_csv("https://raw.githubusercontent.com/wesm/pydata-book/master/ch08/tips.csv", sep=',')
groupedvalues=df.groupby('day').sum().reset_index()
groupedvalues=groupedvalues.sort_values('total_bill').reset_index()
g=sns.barplot(x='day',y='tip',data=groupedvalues, palette="Blues")