Seabornで、データフレームにはあるがグラフにはない値を棒グラフで表示する場合、次の2つのことをどうすればよいか考えています。
データフレーム内のあるフィールドの値を表示しながら、別のフィールドをグラフ化したいのですが。 例えば、以下のように、私は 'tip' をグラフ化していますが、 'total_bill' の値を各バーの中央に配置したいのです(例:金曜日の上に325.88、 1778.40 上記土曜日など)
棒グラフの色をスケーリングする方法はありますか? '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)
次のような結果が得られます:
暫定的な解決策です:
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.
リンク先の質問(シーボーン棒グラフのカラースケールを変更する)からの解答にこだわろう。あなたは、棒グラフを着色するために使用する色の順序を決定するためにargsortを使用したいと思います。リンク先の質問では、argsortはSeriesオブジェクトに適用されており、問題なく動作しますが、ここではDataFrameを使用しています。そこで、DataFrameの1つの列を選択して、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()
<hr>;
2回目の試みは同様にうまくいきます。唯一の問題は、rank()
が返すランクがゼロではなく、1
から始まるということです。そのため、配列から1を引かなければなりません。また、インデックスを作成するには整数値が必要なので、int
にキャストする必要があります。
rank = groupedvalues['total_bill'].rank(ascending=True).values
rank = (rank-1).astype(np.int)
1つの軸、または軸の行列(サブプロット)で動作します。
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)
水平バープロットグラフのラベル付けに誰かが興味を持っている場合に備えて、Sharon's weenを次のように変更しました。
``。 def show_values_on_bars(axs、h_v = "v"、space = 0.4): def _show_on_single_plot(ax): h_v == "v"の場合: ax.patchesのpの場合: _x = p.get_x()+ p.get_width()/ 2。 _y = p.get_y()+ p.get_height()。 値= int(p.get_height())。 ax.text(_x、_y、value、ha = "center")。 elif h_v == "h": ax.patchesのpの場合: _x = p.get_x()+ p.get_width()+ float(space)。 _y = p.get_y()+ p.get_height()。 値= int(p.get_width())。 ax.text(_x、_y、value、ha = "left")。
if isinstance(axs、np.ndarray):
idxの場合、np.ndenumerate(axs)のax:
_show_on_single_plot(ax)。
その他:
_show_on_single_plot(axs)。
``。
2つのパラメーターの説明:。
h_v
-バープロットが水平か垂直か。 "h "
は水平バープロットを表し、" v "
は垂直バープロットを表します。
space
-値テキストとバーの上端の間のスペース。 水平モードでのみ機能します。
例:。
。 show_values_on_bars(sns_t、 "h"、0.3)。
。
。。
項目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")