2012-10-11 30 views
16

Tôi đang làm việc trên một âm mưu có dấu 'x' mờ (20% alpha). Làm cách nào để làm cho điểm đánh dấu xuất hiện ở mức độ mờ đục 100% trong chú giải?Đặt độ mờ biểu tượng chú giải bằng matplotlib?

import matplotlib.pyplot as plt 
plt.plot_date(x = xaxis, y = yaxis, marker = 'x', color=[1, 0, 0, .2], label='Data Series') 
plt.legend(loc=3, mode="expand", numpoints=1, scatterpoints=1) 

Trả lời

3

Nếu bạn muốn có điều gì đó cụ thể trong chú giải, việc xác định đối tượng bạn đặt trong chú giải bằng văn bản thích hợp sẽ dễ dàng hơn. Ví dụ:

import matplotlib.pyplot as plt 
import pylab 

plt.plot_date(x = xaxis, y = yaxis, marker = 'x', color=[1, 0, 0, .2], label='Data Series') 
line1 = pylab.Line2D(range(1),range(1),color='white',marker='x',markersize=10, markerfacecolor="red",alpha=1.0) 
line2 = pylab.Line2D(range(10),range(10),marker="_",linewidth=3.0,color="dodgerblue",alpha=1.0) 
plt.legend((line1,line2),('Text','Other Text'),numpoints=1,loc=1) 

Ở đây, dòng1 xác định đường kẻ ngắn, màu trắng (rất cơ bản) với điểm đánh dấu 'x' màu đỏ và toàn bộ độ mờ. Ví dụ: line2 cung cấp cho bạn dòng màu xanh dài hơn mà không có điểm đánh dấu nào hiển thị. Bằng cách tạo "dòng" này, bạn có thể dễ dàng kiểm soát các thuộc tính của chúng trong chú giải.

6

Theo dõi về câu trả lời cosmosis, để làm cho dòng "giả" cho huyền thoại ẩn trên cốt truyện, bạn có thể sử dụng Nans, và họ vẫn sẽ làm việc để tạo ra mục huyền thoại:

import numpy as np 
import matplotlib.pyplot as plt 
# Plot data with alpha=0.2 
plt.plot((0,1), (0,1), marker = 'x', color=[1, 0, 0, .2]) 
# Plot non-displayed NaN line for legend, leave alpha at default of 1.0 
legend_line_1 = plt.plot(np.NaN, np.NaN, marker = 'x', color=[1, 0, 0], label='Data Series') 
plt.legend() 
0

Tôi đã thấy rằng chức năng .set_alpha() hoạt động trên nhiều đối tượng chú giải, nhưng rất tiếc, nhiều đối tượng chú giải có nhiều phần (chẳng hạn như đầu ra của errorbar()) và cuộc gọi .set_alpha() sẽ chỉ ảnh hưởng đến một trong số các đối tượng đó.

Người ta có thể sử dụng .get_legend_handles_labels() và sau đó lặp qua các bộ phận của tay cầm và .set_alpha(), nhưng không may, copy.deepcopy() dường như không làm việc trên danh sách các xử lý, do đó cốt truyện riêng của mình sẽ bị ảnh hưởng. Cách giải quyết tốt nhất tôi có thể tìm thấy là lưu các chữ cái gốc, .set_alpha() vào những gì tôi muốn, tạo chú giải, sau đó đặt lại các ký tự lôgic trở về giá trị ban đầu của chúng. Nó sẽ sạch hơn nhiều nếu tôi có thể làm sâu hơn handles (Tôi sẽ không phải lưu các giá trị alpha hoặc đặt lại chúng), nhưng tôi không thể làm điều này trong python2.7 (có thể điều này phụ thuộc vào những đối tượng trong truyền thuyết).

f,ax=plt.subplots(1) 

ax.plot( ... ) 

def legend_alpha(ax,newalpha=1.0): 
    #sets alpha of legends to some value 
    #this would be easier if deepcopy worked on handles, but it doesn't 
    handles,labels=ax.get_legend_handles_labels() 
    alphass=[None]*len(handles) #make a list to hold lists of saved alpha values 
    for k,handle in enumerate(handles): #loop through the legend entries 
     alphas=[None]*len(handle) #make a list to hold the alphas of the pieces of this legend entry 
     for i,h in enumerate(handle): #loop through the pieces of this legend entry (there could be a line and a marker, for example) 
      try: #if handle was a simple list of parts, then this will work 
       alphas[i]=h.get_alpha() 
       h.set_alpha(newalpha) 
      except: #if handle was a list of parts which themselves were made up of smaller subcomponents, then we must go one level deeper still. 
       #this was needed for the output of errorbar() and may not be needed for simpler plot objects 
       alph=[None]*len(h) 
       for j,hh in enumerate(h): 
        alph[j]=hh.get_alpha() #read the alpha values of the sub-components of the piece of this legend entry 
        hh.set_alpha(newalpha) 
       alphas[i]=alph #save the list of alpha values for the subcomponents of this piece of this legend entry 
     alphass[k]=alphas #save the list of alpha values for the pieces of this legend entry 
    leg=ax.legend(handles,labels) #create the legend while handles has updated alpha values 
    for k,handle in enumerate(handles): #loop through legend items to restore origina alphas on the plot 
     for i,h in enumerate(handle): #loop through pieces of this legend item to restore alpha values on the plot 
      try: 
       h.set_alpha(alphass[k][i]) 
      except: 
       for j,hh in enumerate(h): #loop through sub-components of this piece of this legend item to restore alpha values 
        hh.set_alpha(alphass[k][i][j]) 
    return leg 

leg=legend_alpha(ax) 
leg.draggable() 
8

CẬP NHẬT: Có cách dễ dàng hơn! Đầu tiên, chuyển nhượng huyền thoại của bạn để một biến khi bạn tạo ra nó:

leg = plt.legend() 

Sau đó:

for lh in leg.legendHandles: 
    lh._legmarker.set_alpha(0) 

HOẶC

for lh in leg.legendHandles: 
    lh.set_alpha(0) 

để làm cho các dấu hiệu của bạn trong suốt cho một plt.plot hoặc một plt.scatter, tương ứng .

Lưu ý rằng chỉ cần sử dụng lh.set_alpha(0) trên plt.plot sẽ làm cho các dòng trong chú giải của bạn trong suốt hơn là điểm đánh dấu. Bạn sẽ có khả năng thích ứng với hai khả năng này cho các loại cốt truyện khác.

Nguồn: Tổng hợp từ một số good advice bởi DrV về kích thước đánh dấu. Cập nhật được lấy cảm hứng từ nhận xét hữu ích từ Owen.

+1

Đây là câu trả lời đơn giản nhất cho vấn đề của tôi! Tôi sẽ thêm hai ghi chú: 1) Bạn có thể nhận tùy chọn chú giải bằng 'leg = plt.legend()' khi bạn tạo chú giải. 2) Đối với tôi, tôi cần 'lh.set_alpha (1)' không phải 'lh._legmarker.set_alpha (1)' (không chắc chắn nếu API đã thay đổi ...) – Owen

+0

Lưu ý hay. Bạn có đang sử dụng 'plt.scatter()' không?Sau khi chơi với nó một chút, có vẻ như có một số biến thể nhỏ tùy thuộc vào loại cốt truyện của bạn (có lẽ vì 'plt.scatter' không có' _legmarker' cụ thể vì nó không bao giờ cần phân biệt giữa các dòng và dấu.) – CaptainKinematics

+0

Ngoài ra, câu trả lời gốc của tôi và nhận xét của bạn đều sử dụng alpha = 1. để có được sự minh bạch, nhưng khi tôi chơi với nó bây giờ tôi thấy cần alpha = 0. (matplotlib .__ version__ == '1.5.1'). Tôi có uống thuốc điên hay gì đó không? – CaptainKinematics

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