2012-02-12 13 views
9

Đối với hầu hết các âm mưu tương tác của tôi với matplotlib, tôi không muốn sử dụng chế biến latex của toán học. (Chủ yếu là vì nó quá chậm, nhưng cũng bởi vì nó chỉ là một chút quá mờ để sử dụng thường xuyên IMHO.) Nhưng tôi cũng sử dụng các macro của riêng tôi tất cả thời gian khi viết mủ. Chỉ là một ví dụ, thay vì làm một cái gì đó như $M_{\odot}$ tôi xác định $\Msun$. Vì vậy, khi sử dụng matplotlib, tôi có xu hướng chỉ viết tự động sau, và sau đó nhận được một lỗi và phải sửa chữa nó. Đây chỉ là một ví dụ đặc biệt đơn giản, và tôi muốn có sự linh hoạt để xác định lại một vĩ mô trong các bài báo của tôi và các lô của tôi cùng một lúc mà không có quá nhiều công việc.Mở rộng trình phân tích cú pháp mathtext matplotlib

Vì vậy, có cách nào tốt đẹp hợp lý để tôi có thể mở rộng trình phân tích cú pháp mathtext để hiểu những thứ như $\Msun$ không? Hoặc tôi sẽ phải hack mathtext.py hoặc một cái gì đó?

(dự phòng của tôi là xác định Msun như chuỗi r'M_{\odot}' vì vậy tôi có thể viết một cái gì đó giống như r'$M = 10\,' + Msun + '$', nhưng đó là khó chịu và chắc chắn sẽ không có bất kỳ tự động hơn đối với tôi.)

Trả lời

4

Macro không được hỗ trợ bởi mathtext của matplotlib, bạn phải chỉnh sửa mathtext.py. Có lẽ điều dễ nhất cần làm là thực hiện mở rộng macro của riêng bạn trước khi chuyển chuỗi tới trình phân tích cú pháp mathtext, ví dụ: text(x,y,expand(r'$M = \Msun$')) trong đó expand thay thế các macro của riêng bạn như \Msun với ý nghĩa của nó.

+1

Và để tiết kiệm nỗ lực viết, bạn có thể thực hiện chức năng 'văn bản' của riêng bạn mà trước tiên gọi là 'mở rộng' và sau đó chuyển kết quả đến 'văn bản' của matplotlib. Bây giờ bạn chỉ cần gọi mike.text (x, y, '$ \ Msun $') hoặc bất kỳ macro latex nào bạn thích. – Daan

+0

Vâng, điều này sẽ hoạt động. Hơn nữa, vì tôi chỉ sử dụng 'ipython --pylab', tôi nghĩ rằng tôi có thể' del text', sau đó nhập 'mike.text', sẽ gọi' matplotlib.pyplot.text' - và tương tự cho 'xlabel', 'ylabel', vv (Mặc dù tôi là một newbie python, vì vậy hãy sửa tôi nếu đó là ngu ngốc.) Cảm ơn! – Mike

0

Bạn có thể thêm mủ của bạn \newcommand s vào phần mở đầu, như ở đây: Matplotlib latex working directory/search path

+0

Nhưng đây là thời điểm tôi đặc biệt không muốn sử dụng quá trình xử lý tex ('rcParams ['text.usetex'] = False'), do đó phần mở đầu cao su không được sử dụng. – Mike