2017-06-02 19 views
8

Tôi muốn tạo một ô phân tán của gấu trúc DataFrame với các nhãn hàng và cột bằng cách sử dụng matplotlib. Một DataFrame mẫu giống như sau:Phân tán âm mưu gấu trúc DataFrame với các hàng/cột được gắn nhãn theo thứ tự

import pandas as pd 
df = pd.DataFrame({"a": [1,2], "b": [3,4]}, index=["c","d"]) 
# a b 
#c 1 2 
#d 3 4 

Kích thước đánh dấu là hàm của các giá trị DataFrame tương ứng. Cho đến nay, tôi đã đưa ra một giải pháp khó xử về cơ bản liệt kê các hàng và cột, vẽ dữ liệu và sau đó xây dựng lại các nhãn:

flat = df.reset_index(drop=True).T.reset_index(drop=True).T.stack().reset_index() 
# level_0 level_1 0 
#0  0  0 1 
#1  0  1 2 
#2  1  0 3 
#3  1  1 4 

flat.plot(kind='scatter', x='level_0', y='level_1', s=100*flat[0]) 
plt.xticks(range(df.shape[1]), df.columns) 
plt.yticks(range(df.shape[0]), df.index) 
plt.show() 

Loại tác phẩm nào. Which kind of works

Bây giờ, câu hỏi: Có cách nào trực quan hơn, tích hợp hơn để tạo ra âm mưu phân tán này, lý tưởng mà không tách dữ liệu và siêu dữ liệu?

+0

Tôi không nghĩ rằng chúng ta có thể sử dụng dữ liệu phi số cho âm mưu. AFAIK, bạn sẽ phải đặt ve một cách riêng biệt ... – MaxU

+1

Tôi đoán câu hỏi được dịch trong * "Tại sao thư viện không triển khai chức năng tùy chỉnh âm mưu tùy chỉnh của tôi?" *. – ImportanceOfBeingErnest

Trả lời

7

Có lẽ không phải là toàn bộ câu trả lời bạn tìm kiếm, nhưng một ý tưởng để giúp tiết kiệm thời gian và khả năng đọc với dòng mã flat=.

Phương thức Pandas unstack sẽ tạo một Series với MultiIndex.

dfu = df.unstack() 

print(dfu.index) 
MultiIndex(levels=[[u'a', u'b'], [u'c', u'd']], 
      labels=[[0, 0, 1, 1], [0, 1, 0, 1]]) 

MultiIndex chứa chứa các điểm x và y cần thiết để xây dựng cốt truyện (trong labels). Ở đây, tôi chỉ định levelslabels cho các tên biến thông tin hơn phù hợp hơn cho âm mưu.

xlabels, ylabels = dfu.index.levels 
xs, ys = dfu.index.labels 

Âm mưu khá thẳng về phía trước từ đây.

plt.scatter(xs, ys, s=dfu*100) 
plt.xticks(range(len(xlabels)), xlabels) 
plt.yticks(range(len(ylabels)), ylabels) 
plt.show() 

enter image description here

Tôi cố gắng này trên một vài DataFrame hình dạng khác nhau và nó dường như nắm giữ lên.

4

Đó không phải là chính xác những gì bạn được yêu cầu, nhưng nó giúp hình dung giá trị trong một cách tương tự:

import seaborn as sns 

sns.heatmap(df[::-1], annot=True) 

Kết quả:

enter image description here

+0

Vâng ... Đó là bẩm sinh, không phải là matplotlib. Nhưng cảm ơn! – DyZ

3

lẽ bạn có thể sử dụng NumPy mảng và pd.melt để tạo biểu đồ phân tán như hình dưới đây:

arr = np.array([[i,j] for i in range(df.shape[1]) for j in range(df.shape[0])]) 
plt.scatter(arr[:,0],arr[:,1],s=100*pd.melt(df)['value'],marker='o') 
plt.xlabel('level_0') 
plt.ylabel('level_1') 
plt.xticks(range(df.shape[1]), df.columns) 
plt.yticks(range(df.shape[0]), df.index) 
plt.show() 

enter image description here

Các vấn đề liên quan