Vẽ biểu đồ phân tán phân loại trong seaborn hoặc matplotlib
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
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'
)