Plot sebar kategoris di seaborn atau matplotlib

Nov 15 2020

Saya memiliki dataframe berikut

   it, A   B   C   D
0  10, aa  mn  cd  kk
1  100, ab  cd  wc  ll
2  1000, wc  cd  mn  sf
3  10000, ll  ll  kk  mn
4  100000, wc  kk  mn  cd
5  1000000, aa  ll  we  sf
6  10000000, ss  aa  ss  kk

dibuat sebagai

options = ["ab", "cd", "bb", "aa", "we", "ss", "kk", "mn", "re", "wc", "ll", "sf"]
df = pd.DataFrame(columns=["A", "B", "C", "D"])
for i, it in enumerate([1,2,3,4,5,6,7]):
    row = [10**i, random.sample(options, 1)[0], random.sample(options, 1)[0], 
           random.sample(options, 1)[0], random.sample(options, 1)[0]]
    df.loc[i] = row

Tujuannya adalah untuk membuat diagram sebar di mana sumbu y adalah nilai unik dari kerangka data dalam urutan yang diurutkan, misalnya opsi dan sumbu a sesuai dengan kolom it. Sekarang tergantung pada apakah data milik kolom A, B, C,atau Dsaya ingin mewarnai titik-titik secara berbeda dan menentukan legenda. Jadi saya tahu dari kelas mana sebuah titik berasal.

Bagaimana cara melakukannya di seaborn atau matplotlib?

Cara saya melakukannya di matplotlib adalah

iters = list(range(df.shape[0]))
x, y = sort(iters, df["A"])
plt.scatter(x, y, color="red")
x, y = sort(iters, df["B"])
plt.scatter(x, y, color="blue")
...

tetapi itu tidak mengurutkan seluruh sumbu y, hanya label yang dimiliki kolom terpisah.

Jawaban

1 QuangHoang Nov 15 2020 at 10:31

Mari kita coba susun data, ubah menjadi kategorikal dengan urutan, urutkan, dan plot yang diberikan:

s = df.stack() 

s = pd.Series(pd.Categorical(s, categories=options, ordered=True),
              index=s.index)

sns.scatterplot(data=s.sort_values().reset_index(name='value'),
                x='level_0', y='value', hue='level_1'
               )

Keluaran:


Perbarui : jika Anda memiliki kolom xvaluedan hanya menangani beberapa kolom ['A','B','C','D'], gunakan meltsebagai ganti stack:

s = df.melt(id_vars='xvalue', 
            value_vars=['A','B','C','D'],
            value_name='value',
            var_name='column')
s['value'] = pd.Categorical(s['value'], categories=options, ordered=True)

sns.scatterplot(data=s.sort_values('value'),
                x='xvalue', y='value', hue='column'
               )