Vẽ biểu đồ phân tán phân loại trong seaborn hoặc matplotlib

Nov 15 2020

Tôi có khung dữ liệu sau

   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

được tạo ra như

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

Mục đích là tạo biểu đồ phân tán trong đó trục y là các giá trị duy nhất từ ​​khung dữ liệu theo thứ tự được sắp xếp, ví dụ: tùy chọn và trục tương ứng với cột it. Bây giờ, tùy thuộc vào việc dữ liệu thuộc về cột A, B, C,hay Dtôi muốn tô màu các chấm phân tán khác nhau và chỉ định chú giải. Vì vậy, tôi biết lớp học một dấu chấm đến từ.

Làm cách nào để làm điều đó trong seaborn hoặc matplotlib?

Cách tôi đang làm trong matplotlib là

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")
...

nhưng điều đó không sắp xếp toàn bộ trục y, chỉ các nhãn thuộc các cột riêng biệt.

Trả lời

1 QuangHoang Nov 15 2020 at 10:31

Hãy thử ngăn xếp dữ liệu, chuyển đổi thành phân loại với thứ tự, sắp xếp và biểu đồ nhất định:

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'
               )

Đầu ra:


Cập nhật : nếu bạn có một cột xvaluevà chỉ quan tâm đến một số cột ['A','B','C','D'], hãy sử dụng meltthay vì 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'
               )