Seaborn 막대 그림 - 값 표시

데이터 프레임에는 있지만 그래프에는 없는 값을 표시하기 위해 막대 차트를 사용하여 Seaborn에서 두 가지 작업을 수행하는 방법을 찾고 있습니다.

  1. 다른 필드를 그래프로 표시하는 동안 데이터 프레임의 한 필드 값을 표시하려고 합니다. 예를 들어 아래에서는 'tip'를 그래프로 표시하지만 'total_bill'의 값을 각 막대(즉, 금요일 위의 325.88) 위에 중앙에 배치하고 싶습니다. 토요일 이상 1778.40 등)

  2. 가장 낮은 값인 '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)

다음과 같은 결과를 얻습니다.

[1

임시 솔루션:

for index, row in groupedvalues.iterrows():
    g.text(row.name,row.tip, round(row.total_bill,2), color='black', ha="center")

[2

shading에서 아래 예제를 사용하여 다음을 시도했습니다.

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: 인덱스 4가 크기가 4인 축 0에 대한 범위를 벗어났습니다

해결책

연결된 질문(시본 바 플롯에서 색상 척도 변경))의 해법을 고수합시다. argsort를 사용하여 막대를 색칠하는 데 사용할 색 순서를 결정하려고 합니다. 연결된 질문에서 Argsort는 Series 객체에 적용되며, 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()

[![여기에 이미지 설명 입력](https://i.stack.imgur.com/104c8.핑그)1


두 번째 시도도 잘 되는데 유일한 문제는 'rank()'로 반환되는 순위가 0이 아닌 '1'에서 시작된다는 것이다. 그래서 배열에서 1을 빼야 한다. 또한 인덱싱을 위해서는 정수 값이 필요하므로 'int'로 캐스팅해야 한다.
rank = groupedvalues['total_bill'].rank(ascending=True).values
rank = (rank-1).astype(np.int)
해설 (0)

단일 축 또는 축 행렬(하위 그림)과 함께 작동

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)
해설 (1)

이것이 항목 2에 도움이 되기를 바랍니다. a) 총 청구서별로 정렬한 후 인덱스를 이 열로 재설정할 수 있습니다. b) 팔레트=" 사용파란색을 사용하여 옅은 파란색에서 진한 파란색으로 차트의 크기를 조정합니다(검은 파란색에서 옅은 파란색으로 차트의 크기를 조정할 경우 팔레트=" 사용).블루스_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")
해설 (2)