2012-11-15 19 views
21

Giả sử tôi có một trục matplotlib được gọi là ax và tôi muốn đặt một số thuộc tính của nó. Hiện tại, tôi làm như sau:Cách ưa thích để đặt các thuộc tính hình/trục matplotlib

ax.set_yscale('log') 
ax.set_xlim([0,10]) 
ax.set_xlabel('some label') 

Nhưng sau một thời gian, nó sẽ trở nên tẻ nhạt. Sau đó, tôi chạy vào phương thức này:

ax.set(yscale='log', xlim=[0,10], xlabel='some label') 

Ngắn gọn hơn nhiều, nhưng có vẻ như không có giấy tờ. Ý tôi là tất cả tài liệu nói là "Lệnh tkstyle set, vượt qua kwargs để đặt thuộc tính".

Cách ưa thích hoặc thành ngữ là gì? Phương thức set có ổn định không?

Trả lời

14

Pyplot tutorial dường như đề xuất các chức năng ax.set_xxx(), nhưng cũng đề cập đến .setp(xxx=).

Mặt khác, chức năng .set(xxx=) không được sử dụng và .setp(xxx=), trong khi được ghi lại, không được sử dụng trong bất kỳ ví dụ nào (Pyplot API).

Tôi hiểu rằng matplotlib hỗ trợ cả kiểu lập trình bắt buộc và phong cách giống như MATLAB. Lý do là cơ sở người dùng mục tiêu - những người đã quen thuộc với Python và những người đã sử dụng Matlab trước đây.

Tôi kết luận rằng matplotlib được đề xuất api là .set_xxx().

Kiểm tra nhanh qua số gallery xác nhận điều này.

Tính hai mặt tương tự tồn tại đối với các đối số từ khóa đối với hàm lô, ngoại trừ API bắt buộc đó không rõ ràng.

+0

Câu trả lời bao gồm api matplotlib rõ ràng. Tôi muốn cả hai tùy chọn có sẵn và tài liệu. –

+0

Câu trả lời hay, cảm ơn. Không chắc chắn nếu 'setp (xxx = y)' hay 'set_xxx (y)' là nhiều hơn "pythonic", nhưng cả hai đều không chính xác hướng đối tượng; sau này sẽ điều hướng lên xuống dưới phân cấp điên của các cá thể lớp matplotlib và đôi khi âm thầm thiết lập thuộc tính lớp hoặc thay thế đầu vào đơn giản/số bằng các cá thể lớp mới (ví dụ: trong 'set_xticklabels (y)', chuyển 'y' sang' ticker .FixedFormatter (y) '). Cả hai chỉ là hướng đối tượng-ish. –

2

Tôi thường sử dụng giao diện pyplot (tương tác) cho matplotlib, hiển thị hàm setp (mà tôi thường sử dụng).

matplotlib hỗ trợ việc sử dụng các setp() (“đặt thuộc tính”) và getp() để bộ và nhận được thuộc tính đối tượng, cũng như để làm mẫn trên đối tượng .

Cho phép bạn làm những điều giống như chức năng set bạn ở trên, chỉ bạn vượt qua các đối tượng để thiết lập như là một tham số:

>>> x = arange(0,1.0,0.01) 
>>> y1 = sin(2*pi*x) 
>>> y2 = sin(4*pi*x) 
>>> lines = plot(x, y1, x, y2) 
>>> setp(lines, linewidth=2, color='r') 

Tôi đoán các setp chức năng thực sự gọi là chức năng đối tượng thông qua của set hoạt động để định vị và đặt kwargs. Vì vậy, suy nghĩ của tôi là, mặc dù thiếu tài liệu phương pháp set của đối tượng là cách tiếp cận thành ngữ để thiết lập nhiều tham số qua kwargs thay vì từng dòng một.

2 xu của tôi.

4

Là một followup siêu muộn để câu hỏi này:

ax.set_xlim(4)ax.set(xlim=4) rút cuộc là điều tương tự, do đó, làm những gì bạn thích. ax.set(kwarg=foo) gọi ax.set_kwarg(foo) thông qua thao tác chuỗi nào đó, vì bạn có thể xem liệu bạn có nhìn vào nguồn không. Các hàm setter khác nhau chủ yếu chỉ là một lớp lót, nhưng tồn tại để cho phép nội suy setp hoạt động.

0

Tôi có vấn đề tương tự với chương trình phụ trợ matplotlib và vì vậy tôi vừa mới xem qua bài đăng này. Tôi đã hy vọng matplotlib sẽ cho phép sử dụng điều khiển từ điển cho các thuộc tính trong một âm mưu. Sử dụng đề xuất của @Chris Zeh bạn có thể:

f = {'xlabel': 'x1', 'ylabel': 'x2'} 
[setp(ax, formati, formatj) for formati, formatj in f.items()] 

giải quyết vấn đề của tôi. Hi vọng điêu nay co ich.

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