2017-06-12 32 views
5

Tôi đã vẽ một ô phân tán với 3 màu khác nhau và tôi muốn khớp màu của biểu tượng và văn bản trong chú giải.matplotlib: màu văn bản chú thích phù hợp với biểu tượng trong ô phân tán

A nice solution tồn tại đối với trường hợp thửa dòng:

leg = ax.legend() 

# change the font colors to match the line colors: 
for line,text in zip(leg.get_lines(), leg.get_texts()): 
    text.set_color(line.get_color()) 

Tuy nhiên, màu sắc biểu đồ phân tán không thể được truy cập bởi get_lines() .Đối với trường hợp của 3 màu Tôi nghĩ rằng tôi có thể tự thiết lập các màu sắc văn bản one- bằng cách sử dụng ví dụ. text.set_color('r'). Nhưng tôi đã tò mò nếu nó có thể được thực hiện tự động như là dòng. Cảm ơn!

+0

Làm thế nào về 'get_children' hoặc 'get_patches'? Bạn có thể cung cấp một ví dụ làm việc tối thiểu? Bạn có thể muốn xem xét các phương pháp chú giải cho các ý tưởng khác: https://matplotlib.org/1.3.0/api/legend_api.html –

+0

@AleksanderLidtke Cảm ơn bạn đã đề xuất! Tôi đã thử 'leg.get_patches()' trước và không có gì trả về. Tôi vừa thử 'leg.get_children()' và nó trả về các đối tượng 'matplotlib.offsetbox.VPacker' và' matplotlib.patches.FancyBboxPatch', không có đối tượng nào có thuộc tính 'get_color()'. Các liên kết giải pháp có một ví dụ làm việc cho các dòng, xin lỗi với các ô phân tán Tôi chỉ có một ví dụ không làm việc ... – Phyinmi

+0

một ví dụ không làm việc là tốt. Xin vui lòng, chỉ cần làm một ví dụ đơn giản cho thấy cách bạn tạo các ô phân tán và truyền thuyết. Nếu nó không hoạt động, xin vui lòng chỉ nói những gì bạn nhận được lỗi. –

Trả lời

0

Điều này có vẻ phức tạp nhưng không cung cấp cho bạn những gì bạn muốn. Gợi ý được hoan nghênh. Tôi sử dụng ax.get_legend_handles_labels() để lấy các điểm đánh dấu và sử dụng tuple(handle.get_facecolor()[0]) để lấy bộ màu matplotlib. Đưa ra một ví dụ với một âm mưu thực sự đơn giản phân tán như thế này:

Edit:

Như ImportanceOfBeingErnest chỉ trong answer mình:

  1. leg.legendHandles sẽ trở lại với huyền thoại xử lý;
  2. Danh sách, thay vì tuple, có thể được sử dụng để gán màu matplotlib.

Codes được đơn giản hóa như:

import matplotlib.pyplot as plt 
from numpy.random import rand 


fig, ax = plt.subplots() 
for color in ['red', 'green', 'blue']: 
    x, y = rand(2, 10) 
    ax.scatter(x, y, c=color, label=color) 

leg = ax.legend() 
for handle, text in zip(leg.legendHandles, leg.get_texts()): 
    text.set_color(handle.get_facecolor()[0]) 

plt.show() 

Những gì tôi nhận được là: enter image description here

4

lô Scatter có một facecolor và một edgecolor. Trình xử lý chú giải cho một phân tán là PathCollection.

Vì vậy, bạn vòng qua tay cầm huyền thoại và thiết lập màu chữ cho facecolor của huyền thoại có thể xử lý

for h, t in zip(leg.legendHandles, leg.get_texts()): 
    t.set_color(h.get_facecolor()[0]) 

mã hoàn chỉnh:

import matplotlib.pyplot as plt 
import numpy as np 

fig, ax = plt.subplots() 
for i in range(3): 
    x,y = np.random.rand(2, 20) 
    ax.scatter(x, y, label="Label {}".format(i)) 

leg = ax.legend() 

for h, t in zip(leg.legendHandles, leg.get_texts()): 
    t.set_color(h.get_facecolor()[0]) 

plt.show() 

enter image description here

+0

Cảm ơn bạn đã đề cập đến 'legendHandles'! Bằng cách nào đó tôi đã không tìm thấy nó trong doc, mặc dù nó có vẻ để cung cấp cho các kết quả tương tự như 'get_legend_handles_labels()' – Phyinmi

+0

Cảm ơn bạn đã hiển thị 'leg.legendHandles' và màu sắc như là một' danh sách'. Đã học hỏi được rất nhiều! –

+1

'legend.legendHandles' là danh sách các tay cầm thực sự trong chú giải, trong khi' ax.get_legend_handles_labels() 'trả về danh sách các xử lý và các nhãn sẽ đủ điều kiện để có trong chú giải.Vì vậy, sự khác biệt sẽ được nhìn thấy khi không bao gồm tất cả các nghệ sĩ trong truyền thuyết hoặc khi đưa các nghệ sĩ trong truyền thuyết, mà không phải là một phần của cốt truyện. – ImportanceOfBeingErnest

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