Barplot lebar variabel dengan seaborn [duplikat]

Saya mencoba membuat plot batang dengan tempat sumbu x lebar variabel di Seaborn. Mirip dengan bagan ini: masukkan deskripsi gambar di sini Semua lebar x saya akan bertambah hingga 100%, namun sepertinya saya tidak dapat menemukan contoh cara mencapai tujuan ini melalui Seaborn. Ada ide?


person D. Smith    schedule 16.10.2017    source sumber
comment
Tidak ada alasan untuk menggunakan plot bar seaborn untuk tujuan ini. Gunakan pyplot.bar sebagai gantinya.   -  person ImportanceOfBeingErnest    schedule 18.10.2017


Jawaban (2)


Mungkin ada beberapa kemungkinan jawaban di sini. Dalam barplot seaborn, Anda dapat menggunakan kombinasi beberapa parameter untuk tujuan tersebut: "width" (nilai lebar batang), "left" (nilai lokasi pada sumbu x, yang merupakan argumen wajib) dan "align" ".

Contoh yang sangat sederhana:

import seaborn as sns

data = [7, 3, 15]
widths = [1, 5, 3]
left = [0, 1, 6]
sns.plt.bar(left, data, width = widths, color=('orange','green','blue'), 
alpha = 0.6, align='edge', edgecolor = 'k', linewidth = 2)

Perhatikan bahwa "kiri" (lokasi batang) harus sesuai dengan lebarnya agar batang hanya bersentuhan dan tidak tumpang tindih.

masukkan deskripsi gambar di sini

person BossaNova    schedule 17.10.2017
comment
Dengan menggunakan sns.plt.bar, Anda memanggil fungsi matplotlibs plt.bar. Ini tidak ada hubungannya dengan seaborn. - person ImportanceOfBeingErnest; 18.10.2017

Jika Anda ingin menggunakan Seaborn untuk barplot, Anda perlu mengubah lebar persegi panjang batang (tambalan) setelahnya (ini dilakukan melalui antarmuka berorientasi objek matplotlib sesuai jawaban ini):

import seaborn as sns

iris = sns.load_dataset('iris')
ax = sns.barplot('species', 'sepal_width', data=iris)
widthbars = [0.3, 0.6, 1.2]
for bar, newwidth in zip(ax.patches, widthbars):
    x = bar.get_x()
    width = bar.get_width()
    centre = x + width/2.
    bar.set_x(centre - newwidth/2.)
    bar.set_width(newwidth)

masukkan deskripsi gambar di sini

Anda juga dapat membuat barplot serupa di matplotlib secara langsung:

import matplotlib.pyplot as plt

widths = [0.3, 0.6, 1.2]
for x_pos, (species_name, species_means) in enumerate(iris.groupby('species').mean().groupby('species')):
     plt.bar(x_pos, species_means['sepal_width'], widths[x_pos])

masukkan deskripsi gambar di sini

person joelostblom    schedule 18.10.2017