2011-10-15 74 views
20

Đây là một loại câu hỏi tiếp theo cho bài đăng this, nơi màu sắc của các trục, ve và nhãn được thảo luận. Tôi hy vọng có thể mở một câu hỏi mới, mở rộng cho việc này.Thay đổi màu sắc của khung hình trong matplotlib

Thay đổi màu của khung hoàn chỉnh (ve và trục) xung quanh ô đôi (qua add_subplot) với trục [ax1, ax2] dẫn đến nhiều mã. Đoạn này sẽ thay đổi màu sắc của khung của cốt truyện trên: (!)

ax1.spines['bottom'].set_color('green') 
ax1.spines['top'].set_color('green') 
ax1.spines['left'].set_color('green') 
ax1.spines['right'].set_color('green') 
for t in ax1.xaxis.get_ticklines(): t.set_color('green') 
for t in ax1.yaxis.get_ticklines(): t.set_color('green') 
for t in ax2.xaxis.get_ticklines(): t.set_color('green') 
for t in ax2.yaxis.get_ticklines(): t.set_color('green') 

Vì vậy, để thay đổi màu khung của hai lô với hai y trục mỗi, tôi sẽ cần 16 dòng mã .. . Đây là cách nó trông giống như:

enter image description here

Các phương pháp khác tôi đào lên cho đến nay:

  • matplotlib.rc: đã thảo luận here; thay đổi trên toàn cầu, chứ không phải cục bộ. Tôi muốn có một số lô khác trong các màu khác nhau. Xin vui lòng, không thảo luận về quá nhiều màu sắc trong âm mưu ... :-)

    matplotlib.rc('axes',edgecolor='green') 
    
  • đào ra những chiếc gai của trục, sau đó thay đổi nó: cũng đã thảo luận here; không thực sự tao nhã, tôi nghĩ vậy.

    for child in ax.get_children(): 
        if isinstance(child, matplotlib.spines.Spine): 
         child.set_color('#dddddd') 
    

Có một nhã cách ngưng tụ khối ở trên, một cái gì đó hơn "pythonic"?

Tôi đang sử dụng trăn 2.6.5 với matplotlib 0.99.1.1 trong ubuntu.

Trả lời

12

Refactoring mã của bạn ở trên:

import matplotlib.pyplot as plt 

for ax, color in zip([ax1, ax2, ax3, ax4], ['green', 'green', 'blue', 'blue']): 
    plt.setp(ax.spines.values(), color=color) 
    plt.setp([ax.get_xticklines(), ax.get_yticklines()], color=color) 
+0

Đẹp nhất. Xin vui lòng bao gồm hai màu và tôi sẽ 'chấp nhận' câu trả lời của bạn. (ví dụ: 'cho rìu, màu sắc trong zip ([ax1, ax2, ax3, ax4], ['xanh', 'xanh lục', 'xanh', 'xanh dương']): plt.setp (ax.spines.values(), color = color); plt.setp ([ax.get_xticklines(), ax.get_yticklines()], color = color) ') – Boffin

+0

@Boffin done :) – ianalis

+0

trong dòng cuối cùng của bạn, tôi nghĩ bạn có nghĩa là' ax1 'chỉ là 'ax' – Joel

9

Giả sử bạn đang sử dụng một phiên bản cập nhật lên một cách hợp lý của matplotlib (> = 1,0), có lẽ thử một cái gì đó như thế này:

import matplotlib.pyplot as plt 

# Make the plot... 
fig, axes = plt.subplots(nrows=2) 
axes[0].plot(range(10), 'r-') 
axes[1].plot(range(10), 'bo-') 

# Set the borders to a given color... 
for ax in axes: 
    ax.tick_params(color='green', labelcolor='green') 
    for spine in ax.spines.values(): 
     spine.set_edgecolor('green') 

plt.show() 

enter image description here

+0

tôi chạy matplotlib 0.99.1.1 (D'oh!). Ngoài ra tôi đã không giải thích cốt truyện hai lần rất tốt. Tôi đã cập nhật câu hỏi ban đầu và thêm một hình ảnh.Bạn đã cho thấy một khả năng tô màu khác mà tôi có thể thêm vào danh sách của mình (nếu chạy phiên bản cập nhật của m.p.l.). Là của bạn vẫn còn ngắn hơn nếu bạn tô màu một khung với hai trục y trong một âm mưu? – Boffin

3

Có lẽ đó là một chút dầu thô để trả lời câu hỏi của riêng tôi, nhưng tôi muốn chia sẻ những gì tôi có thể tìm thấy cho đến nay. Phiên bản này có thể tô màu hai ô phụ bằng các trục [ax1, ax2][ax3, ax4] bằng hai màu khác nhau. Đó là nhiều hơn ngắn hơn 16 dòng tôi đã nêu trong câu hỏi của mình ở trên. Nó được lấy cảm hứng từ câu trả lời của Joe Kington ở đây và trong twinx kills tick label color.

import matplotlib.pyplot as plt 
import numpy as np 

# Generate some data 
num = 200 
x = np.linspace(501, 1200, num) 
yellow_data, green_data , blue_data= np.random.random((3,num)) 
green_data += np.linspace(0, 3, yellow_data.size)/2 
blue_data += np.linspace(0, 3, yellow_data.size)/2 

fig = plt.figure() 
plt.subplot(211) # Upper Plot 
ax1 = fig.add_subplot(211) 
ax1.fill_between(x, 0, yellow_data, color='yellow') 
ax2 = ax1.twinx() 
ax2.plot(x, green_data, 'green') 
plt.setp(plt.gca(), xticklabels=[]) 
plt.subplot(212) # Lower Plot 
ax3 = fig.add_subplot(212) 
ax3.fill_between(x, 0, yellow_data, color='yellow') 
ax4 = ax3.twinx() 
ax4.plot(x, blue_data, 'blue') 

# Start coloring 
for ax, color in zip([ax1, ax2, ax3, ax4], ['green', 'green', 'blue', 'blue']): 
    for ticks in ax.xaxis.get_ticklines() + ax.yaxis.get_ticklines(): 
     ticks.set_color(color) 
    for pos in ['top', 'bottom', 'right', 'left']: 
     ax.spines[pos].set_edgecolor(color) 
# End coloring 

plt.show() 

color_plots

tôi đánh dấu này như được chấp nhận vì nó là giải pháp nhỏ gọn nhất mà tôi có thể tìm thấy cho đến nay. Tuy nhiên, tôi mở cửa cho những cách khác, có lẽ thanh lịch hơn để giải quyết nó.

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