2012-12-11 25 views
10

Trên một số màn hình LCD nhất định, màu sắc của các đường ngang trong chú giải khó phân biệt. (Xem hình ảnh đính kèm). Vì vậy, thay vì vẽ một dòng trong truyền thuyết, có thể chỉ cần mã màu văn bản chính nó? nên một lời nói, có "y = 0x" màu xanh lam, "y = 1x" màu xanh lá cây, vv ...Matplotlib: Văn bản được mã hóa màu trong chú giải thay vì một dòng

import matplotlib.pyplot as plt 
import numpy as np 

x = np.arange(10) 

fig = plt.figure() 
ax = plt.subplot(111) 

for i in xrange(5): 
    ax.plot(x, i * x, label='$y = %ix$' % i) 

ax.legend() 

plt.show() 

enter image description here

PS. nếu dòng có thể được làm dày hơn chỉ trong truyền thuyết, nhưng không phải trong cốt truyện, điều này cũng sẽ làm việc.

Trả lời

7

Chỉ cần đặt linewidth của huyền thoại xử lý:

In [55]: fig, ax = plt.subplots() 

In [56]: x = np.arange(10) 

In [57]: for i in xrange(5):      
    ....:  ax.plot(x, i * x, label='$y = %ix$' % i) 
    ....:  

In [58]: leg = ax.legend(loc='best') 

In [59]: for l in leg.legendHandles:    
    ....:  l.set_linewidth(10) 
    ....:  

legend_linewidth.png

15

tôi đã tự hỏi điều tương tự. Đây là những gì tôi đã đưa ra để thay đổi màu sắc của phông chữ trong truyền thuyết. Tôi không hoàn toàn hài lòng với phương pháp này, vì nó có vẻ một chút vụng về, nhưng có vẻ như để có được công việc làm [Chỉnh sửa: xem dưới đây để biết một cách tốt hơn]:

import matplotlib.pyplot as plt 
import numpy as np 

x = np.arange(10) 

fig = plt.figure() 
ax = plt.subplot(111) 

colors = [] 
for i in xrange(5): 
    line, = ax.plot(x, i * x, label='$y = %ix$' % i) 
    colors.append(plt.getp(line,'color')) 

leg = ax.legend() 

for color,text in zip(colors,leg.get_texts()): 
    text.set_color(color) 

plt.show() 

the colorful results

2016 Chỉnh sửa:

Thực ra, có cách tốt hơn. Bạn chỉ có thể lặp qua các dòng trong chú giải, điều này tránh được việc phải theo dõi các màu khi các đường được vẽ. Ít khó khăn hơn. Bây giờ, việc thay đổi màu sắc của đường thẳng về cơ bản là một lớp lót (không sao, nó thực sự là một lớp lót hai lớp). Dưới đây là ví dụ hoàn chỉnh:

import matplotlib.pyplot as plt 
import numpy as np 

x = np.arange(10) 

fig = plt.figure() 
ax = plt.subplot(111) 

for i in xrange(5): 
    ax.plot(x, i*x, label='$y = %ix$'%i) 

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()) 

plt.show() 

2017 Chỉnh sửa: Cuối cùng, nếu bạn thực sự làm muốn các văn bản mã màu thay của một dòng (như tựa đề), sau đó bạn có thể ngăn chặn các dòng trong truyền thuyết bằng cách sử dụng

leg = ax.legend(handlelength=0) 
6

Thao tác này có thể được thực hiện sạch sau khi tất cả âm mưu được thực hiện qua getters/setters văn bản và getters/setters trục. Đặt màu văn bản chú thích giống như màu của đường kẻ trong vòng lặp for trước khi vẽ đồ thị.

import matplotlib.pyplot as plt 
import numpy as np 

x = np.arange(10) 

fig = plt.figure() 
ax = plt.subplot(111) 

for i in xrange(5): 
    ax.plot(x, i * x, label='$y = %ix$' % i) 

leg = ax.legend() 

def color_legend_texts(leg): 
    """Color legend texts based on color of corresponding lines""" 
    for line, txt in zip(leg.get_lines(), leg.get_texts()): 
     txt.set_color(line.get_color()) 

color_legend_texts(leg)  

plt.show() 

Sự khác biệt chính cần lưu ý trong câu trả lời này là định dạng ô có thể được tách hoàn toàn khỏi thao tác vẽ đồ thị.

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