Saya ingin melihat bagaimana melakukan dua hal di Seaborn dengan menggunakan diagram batang untuk menampilkan nilai yang ada di dalam dataframe, tetapi tidak di dalam grafik
Saya ingin menampilkan nilai dari satu bidang dalam dataframe sambil membuat grafik yang lain. Misalnya, di bawah ini, saya membuat grafik 'tip', tetapi saya ingin menempatkan nilai 'total_bill' di tengah-tengah di atas setiap bar (mis.325.88 di atas hari Jumat, 1778.40 di atas hari Sabtu, dll.)
Apakah ada cara untuk menskalakan warna bar, dengan nilai terendah dari 'total_bill' memiliki warna paling terang (dalam hal ini hari Jumat) dan nilai tertinggi dari 'total_bill' memiliki warna paling gelap. Jelas, saya akan tetap menggunakan satu warna (yaitu biru) ketika saya melakukan penskalaan.
Terima kasih! Saya yakin ini mudah, tapi saya melewatkannya...
** Sementara saya melihat bahwa orang lain berpikir bahwa ini adalah duplikat dari masalah lain (atau dua), saya kehilangan bagian bagaimana saya menggunakan nilai yang tidak ada dalam grafik sebagai dasar untuk label atau bayangan. Bagaimana saya mengatakan, gunakan total_bill sebagai dasar. Maaf, tapi saya tidak bisa mengetahuinya berdasarkan jawaban-jawaban tersebut.
Dimulai dengan kode berikut,
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)
Saya mendapatkan hasil berikut ini:
Solusi Sementara:
for index, row in groupedvalues.iterrows():
g.text(row.name,row.tip, round(row.total_bill,2), color='black', ha="center")
Pada shading, dengan menggunakan contoh di bawah ini, saya mencoba yang berikut ini:
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")
Tetapi itu memberi saya kesalahan berikut:
AttributeError: 'DataFrame' objek tidak memiliki atribut 'argsort'
Jadi saya mencoba modifikasi:
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])
dan itu membuat saya dengan
IndexError: indeks 4 di luar batas untuk sumbu 0 dengan ukuran 4
Mari kita tetap berpegang pada solusi dari pertanyaan yang ditautkan (Mengubah skala warna dalam plot batang seaborn). Anda ingin menggunakan argsort untuk menentukan urutan warna yang akan digunakan untuk mewarnai bar. Dalam pertanyaan terkait, argsort diterapkan pada objek Series, yang berfungsi dengan baik, sementara di sini Anda memiliki DataFrame. Jadi Anda perlu memilih satu kolom DataFrame itu untuk menerapkan 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)
Bekerja dengan kapak tunggal atau dengan matriks kapak (subplot)
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)
Semoga ini membantu untuk item #2: a) Anda dapat mengurutkan berdasarkan total tagihan kemudian mengatur ulang indeks ke kolom ini b) Gunakan palette="Blue" untuk menggunakan warna ini untuk menskalakan grafik Anda dari biru muda ke biru tua (jika biru tua ke biru muda maka gunakan 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")