2014-10-13 24 views
11

Tôi có dữ liệu dẫn đến nhiều dòng được vẽ, tôi muốn cung cấp cho những dòng này một nhãn duy nhất trong chú giải của tôi. Tôi nghĩ rằng điều này có thể được chứng minh tốt hơn bằng cách sử dụng ví dụ bên dưới,pyplot kết hợp nhiều nhãn dòng trong chú thích

a = np.array([[ 3.57, 1.76, 7.42, 6.52], 
       [ 1.57, 1.2 , 3.02, 6.88], 
       [ 2.23, 4.86, 5.12, 2.81], 
       [ 4.48, 1.38, 2.14, 0.86], 
       [ 6.68, 1.72, 8.56, 3.23]]) 

plt.plot(a[:,::2].T, a[:, 1::2].T, 'r', label='data_a') 

plt.legend(loc='best') 

Như bạn có thể thấy tại Out [23] cốt truyện dẫn đến 5 dòng riêng biệt. Lô đất kết quả trông như thế này legend of multiple line plot

Có cách nào để tôi có thể cho biết phương pháp lô đất để tránh nhiều nhãn không? Tôi không muốn sử dụng chú thích tùy chỉnh (nơi bạn chỉ định nhãn và hình dạng đường cùng một lúc) nhiều nhất có thể.

+1

Bạn cần bản tin để tạo ra một huyền thoại tùy chỉnh. Không thể dán liên kết vì điện thoại của tôi đang bị crap. Google "matplotlib tạo chú thích theo cách thủ công". Có một câu trả lời SO có mọi thứ bạn cần một vài lần truy cập xuống. – will

+0

@will cảm ơn, điều đó hữu ích – hashmuke

Trả lời

8

Tôi muốn làm một hàm helper nhỏ cá nhân, nếu tôi đã lên kế hoạch thực hiện nó thường xuyên;

from matplotlib import pyplot 
import numpy 


a = numpy.array([[ 3.57, 1.76, 7.42, 6.52], 
       [ 1.57, 1.2 , 3.02, 6.88], 
       [ 2.23, 4.86, 5.12, 2.81], 
       [ 4.48, 1.38, 2.14, 0.86], 
       [ 6.68, 1.72, 8.56, 3.23]]) 


def plotCollection(ax, xs, ys, *args, **kwargs): 

    ax.plot(xs,ys, *args, **kwargs) 

    if "label" in kwargs.keys(): 

    #remove duplicates 
    handles, labels = pyplot.gca().get_legend_handles_labels() 
    newLabels, newHandles = [], [] 
    for handle, label in zip(handles, labels): 
     if label not in newLabels: 
     newLabels.append(label) 
     newHandles.append(handle) 

    pyplot.legend(newHandles, newLabels) 

ax = pyplot.subplot(1,1,1) 
plotCollection(ax, a[:,::2].T, a[:, 1::2].T, 'r', label='data_a') 
plotCollection(ax, a[:,1::2].T, a[:, ::2].T, 'b', label='data_b') 
pyplot.show() 

Một cách dễ dàng hơn (và IMO rõ ràng hơn) để loại bỏ các bản sao (so với những gì bạn có) từ handleslabels của huyền thoại là thế này:

handles, labels = pyplot.gca().get_legend_handles_labels() 
newLabels, newHandles = [], [] 
for handle, label in zip(handles, labels): 
    if label not in newLabels: 
    newLabels.append(label) 
    newHandles.append(handle) 
pyplot.legend(newHandles, newLabels) 
6

Vì vậy, sử dụng gợi ý chí và một câu hỏi here, tôi đi chữa của tôi ở đây

handles, labels = plt.gca().get_legend_handles_labels() 
i =1 
while i<len(labels): 
    if labels[i] in labels[:i]: 
     del(labels[i]) 
     del(handles[i]) 
    else: 
     i +=1 

plt.legend(handles, labels) 

Và cốt truyện mới trông giống như, modified multiple line plot legend

4

Matplotlib mang đến cho bạn một giao diện đẹp để bộ sưu tập các dòng, LineCollection. Mã này là thẳng về phía trước

import numpy 
import matplotlib.pyplot as plt 
from matplotlib.collections import LineCollection 

a = numpy.array([[ 3.57, 1.76, 7.42, 6.52], 
       [ 1.57, 1.2 , 3.02, 6.88], 
       [ 2.23, 4.86, 5.12, 2.81], 
       [ 4.48, 1.38, 2.14, 0.86], 
       [ 6.68, 1.72, 8.56, 3.23]]) 

xs = a[:,::2] 
ys = a[:, 1::2] 
lines = LineCollection([list(zip(x,y)) for x,y in zip(xs, ys)], label='data_a') 
f, ax = plt.subplots(1, 1) 
ax.add_collection(lines) 
ax.legend() 
ax.set_xlim([xs.min(), xs.max()]) # have to set manually 
ax.set_ylim([ys.min(), ys.max()]) 
plt.show() 

Điều này dẫn đến kết quả dưới đây: A plot of the lines collected under a single legend entry.

4

giải pháp NumPy dựa trên phản ứng của ý chí trên.

import numpy as np 
import matplotlib.pylab as plt 
a = np.array([[3.57, 1.76, 7.42, 6.52], 
       [1.57, 1.20, 3.02, 6.88], 
       [2.23, 4.86, 5.12, 2.81], 
       [4.48, 1.38, 2.14, 0.86], 
       [6.68, 1.72, 8.56, 3.23]]) 

plt.plot(a[:,::2].T, a[:, 1::2].T, 'r', label='data_a') 
handles, labels = plt.gca().get_legend_handles_labels() 

Giả sử các nhãn bằng nhau có tay cầm bằng nhau, nhận nhãn duy nhất và chỉ mục tương ứng của chúng, tương ứng với các chỉ số xử lý.

labels, ids = np.unique(labels, return_index=True) 
handles = [handles[i] for i in ids] 
plt.legend(handles, labels, loc='best') 
plt.show() 
0

Giải pháp công nghệ thấp là thực hiện hai cuộc gọi lô. Một là âm mưu dữ liệu của bạn và một thứ hai âm mưu gì, nhưng mang tay cầm:

a = np.array([[ 3.57, 1.76, 7.42, 6.52], 
       [ 1.57, 1.2 , 3.02, 6.88], 
       [ 2.23, 4.86, 5.12, 2.81], 
       [ 4.48, 1.38, 2.14, 0.86], 
       [ 6.68, 1.72, 8.56, 3.23]]) 

plt.plot(a[:,::2].T, a[:, 1::2].T, 'r') 
plt.plot([],[], 'r', label='data_a') 

plt.legend(loc='best') 

Dưới đây là kết quả:

result

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