2014-09-14 18 views
5

Tôi có một khung dữ liệu gấu trúc của "các yếu tố", phao nổi và số nguyên. Tôi muốn làm cho "R lưới" như âm mưu trên nó bằng cách sử dụng điều hòa và nhóm trên các biến phân loại. Tôi đã sử dụng R rộng rãi và đã viết các chức năng của bảng tùy chỉnh để có được các ô được định dạng chính xác như cách tôi muốn, nhưng tôi đang đấu tranh với matplotlib để làm cùng một loại lô gọn gàng. Tôi đang chơi xung quanh với bố trí và subplot2grid, nhưng chỉ có vẻ không thể làm cho nó đúng.R Lattice như các lô với Python, Pandas và Matplotlib

import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 

nRows = 500 
df = pd.DataFrame({'c1' : np.random.choice(['A','B','C','D'], size=nRows), 
       'c2' : np.random.choice(['P','Q','R'], size=nRows), 
       'i1' : np.random.randint(20,50, nRows), 
       'i2' : np.random.randint(0,10, nRows), 
       'x1' : 3 * np.random.randn(nRows) + 90, 
       'x2' : 2 * np.random.randn(nRows) + 89}) 

Tôi muốn vẽ những thứ như sau (ví dụ mã lưới R)

x1 vs x2 cho mỗi cấp độ của c1 (mã mạng)

xyplot(x1 ~ x2 | c1, data = df) 

x1 vs x2 cho mỗi cấp độ c1 với chú giải "toàn cầu" c2 (biểu tượng hoặc màu sắc)

xyplot(x1 ~ x2 | c1, groups = c2, data = df) 

biểu đồ x1 cho mỗi c2

hist (~x1 | c1, data = df) 

Tôi cũng đang cố gắng để làm cho "lạnh" lô đường viền như những người sản xuất ở đây (1.4.4.4)

https://scipy-lectures.github.io/intro/matplotlib/matplotlib.html

Tôi đã đọc qua những ví dụ: http://nbviewer.ipython.org/github/fonnesbeck/Bios366/blob/master/notebooks/Section2_4-Matplotlib.ipynb

Tuy nhiên, tôi muốn bố trí được tạo ra từ số lượng các cấp trong các biến điều kiện phân loại (hoặc "bởi"). tức là chỉ định một số cột và các hàng sẽ được tính dựa trên các cấp số.

Đánh giá cao bất kỳ lời khuyên hay bước đi đúng hướng nào. Tôi không thích sử dụng rpy2 hoặc python ggplot (tôi đã làm rối tung xung quanh với chúng - thấy chúng rất bực bội và hạn chế).

Cảm ơn! Randall

+0

Có một số mã thử nghiệm trong gấu trúc cho các ô quảng cáo: http://pandas.pydata.org/pandas-docs/stable/rplot.html. Điều đó có giúp được không? Xem thêm http://ggplot.yhathq.com/ giống như ggplot trong R, nó hỗ trợ các lưới khía cạnh. – joris

+0

Bạn có thể thêm một số ví dụ cho các câu hỏi về đường bao. Seaborn có chức năng cho hexbins và 2 lô kde kích thước mà tôi nghĩ rằng sẽ thực hiện những gì bạn đang tìm kiếm. – b10n

Trả lời

8

Seaborn là thư viện hiệu quả nhất mà tôi đã tìm thấy để thực hiện các ô mặt trong python. Trình bao bọc chú ý gấu trúc của nó xung quanh matplotlib, nó sẽ xử lý tất cả nội dung con cho bạn và cập nhật kiểu dáng matplotlib trông hiện đại hơn. Nó tạo ra một số đầu ra thực sự đáng yêu.

Phẫu thuật được thực hiện bằng cách sử dụng phần grid của thư viện.

Nó hoạt động hơi khác so với R khi bạn tạo lưới trước và chuyển dữ liệu vào lưới, cùng với các khía cạnh bạn muốn, hàng, cột, màu sắc, v.v. Sau đó bạn ánh xạ các chức năng vẽ lên lưới đó, chuyển bất kỳ đối số bắt buộc nào cho các hàm vẽ bản đồ được ánh xạ.

#scatter plot one factor 
import seaborn as sns 
grid1 = sns.FacetGrid(df, col='c1') 
grid1.map(plt.scatter, 'x1', 'x2') 


#scatter plot with column and hue factor 
grid2 = sns.FacetGrid(df, col='c1', hue='c2') 
grid2.map(plt.scatter, 'x1', 'x2') 


#histogram with one factor 
grid3 = sns.FacetGrid(df, col='c1') 
grid3.map(plt.hist, 'x1', alpha=.7) 
+0

cập nhật câu trả lời của tôi với các ví dụ – b10n

+1

Điều này thật tuyệt, nhưng chỉ muốn chỉ ra rằng một số các ô này có thể đạt được một chút dễ dàng hơn với hàm 'lmplot'.Bạn có thể tạo cái đầu tiên bằng 'sns.lmplot (" x1 "," x2 ", col =" c2 ", dữ liệu = df)'. Điều này cũng sẽ phù hợp với đường hồi qui, có thể hoặc không hữu ích, nhưng có thể bị vô hiệu hóa bằng cách thêm 'fit_reg = False'. – mwaskom

+0

Tuyệt vời! Tôi bỏ qua điều đó trong tài liệu – b10n

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