web-dev-qa-db-ja.com

Seaborn Barplot-値の表示

私は、グラフではなくデータフレームにある値を表示するために棒グラフを使用してSeabornで2つのことを行う方法を探しています

1)別のグラフを作成しながら、データフレームの1つのフィールドの値を表示しようとしています。たとえば、下の例では「tip」をグラフ化していますが、「total_bill」の値を各バーの中央に配置したいと思います(金曜日の上の325.88、土曜日の上の1778.40など)。

2)「total_bill」の最小値が最も明るい色(この場合は金曜日)で、「total_bill」の最大値が最も暗い色で、バーの色をスケーリングする方法はありますか。明らかに、スケーリングを行うとき、私は1つの色(つまり、青)を使い続けます。

ありがとう!これは簡単だと確信していますが、見逃しています。

他の人はこれが別の問題(または2つ)の複製であると考えていることがわかりますが、グラフにない値を使用する方法の一部が欠落していますラベルまたはシェーディング。どうすれば、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)

次の結果が得られます。

enter image description here

暫定ソリューション:

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

enter image description here

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の範囲外です

単一のxまたはorの行列(サブプロット)で動作します

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)
10
Sharon Soussan

誰かが水平棒グラフのラベル付けに興味がある場合に備えて、 Sharonの答え を以下のように変更しました。

def show_values_on_bars(axs, h_v="v", space=0.4):
    def _show_on_single_plot(ax):
        if h_v == "v":
            for p in ax.patches:
                _x = p.get_x() + p.get_width() / 2
                _y = p.get_y() + p.get_height()
                value = int(p.get_height())
                ax.text(_x, _y, value, ha="center") 
        Elif h_v == "h":
            for p in ax.patches:
                _x = p.get_x() + p.get_width() + float(space)
                _y = p.get_y() + p.get_height()
                value = int(p.get_width())
                ax.text(_x, _y, value, ha="left")

    if isinstance(axs, np.ndarray):
        for idx, ax in np.ndenumerate(axs):
            _show_on_single_plot(ax)
    else:
        _show_on_single_plot(axs)

2つのパラメーターの説明:

h_v-バープロットが水平か垂直か。 "h"は水平バープロットを表し、"v"は垂直バープロットを表します。

space-値テキストとバーの上端の間のスペース。水平モードでのみ機能します。

例:

show_values_on_bars(sns_t, "h", 0.3)

enter image description here

3
Secant Zhang

これがアイテム#2に役立つことを願っています:a)合計請求額でソートし、この列のインデックスをリセットできますb)palette = "Blue"を使用してこの色を使用してチャートをライトブルーからダークブルーにスケールします(ダークブルーの場合は水色の場合、pallet = "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")
2