2013-10-01 14 views
87

TL; DR -> Làm thế nào người ta có thể tạo chú thích cho một đồ thị dòng trong Matplotlib 's PyPlot mà không tạo ra bất kỳ biến thêm?Thêm một huyền thoại để PyPlot trong Matplotlib theo cách đơn giản nhất có thể

Hãy xem xét kịch bản vẽ đồ thị dưới đây:

if __name__ == '__main__': 
    PyPlot.plot(total_lengths, sort_times_bubble, 'b-', 
       total_lengths, sort_times_ins, 'r-', 
       total_lengths, sort_times_merge_r, 'g+', 
       total_lengths, sort_times_merge_i, 'p-',) 
    PyPlot.title("Combined Statistics") 
    PyPlot.xlabel("Length of list (number)") 
    PyPlot.ylabel("Time taken (seconds)") 
    PyPlot.show() 

Như bạn có thể thấy, đây là một sử dụng rất cơ bản của matplotlib 's PyPlot. Đây tưởng tạo ra một đồ thị như hình dưới đây:

Graph

Không có gì đặc biệt, tôi biết. Tuy nhiên, không rõ dữ liệu đang được vẽ ở đâu (Tôi đang cố vẽ dữ liệu của một số thuật toán sắp xếp, độ dài so với thời gian đã thực hiện và tôi muốn đảm bảo mọi người biết được dòng nào). Vì vậy, tôi cần một huyền thoại, tuy nhiên, việc xem xét ví dụ sau đây (from the official site):

ax = subplot(1,1,1) 
p1, = ax.plot([1,2,3], label="line 1") 
p2, = ax.plot([3,2,1], label="line 2") 
p3, = ax.plot([2,3,1], label="line 3") 

handles, labels = ax.get_legend_handles_labels() 

# reverse the order 
ax.legend(handles[::-1], labels[::-1]) 

# or sort them by labels 
import operator 
hl = sorted(zip(handles, labels), 
      key=operator.itemgetter(1)) 
handles2, labels2 = zip(*hl) 

ax.legend(handles2, labels2) 

Bạn sẽ thấy rằng tôi cần phải tạo thêm một biến ax. Làm cách nào để thêm chú giải vào biểu đồ mà không có phải tạo biến phụ này và giữ lại sự đơn giản của tập lệnh hiện tại của tôi.

+0

Tôi bối rối vì lo ngại của bạn về việc tạo thêm biến. Bạn phải làm cho những đồ vật đó đằng sau hậu trường. – tacaswell

+0

@tcaswell Hãy để tôi cố gắng thuyết phục họ. Tôi không muốn tạo thêm các biến, bởi vì nó làm tăng thêm sự phức tạp cho toàn bộ kịch bản lệnh. Tôi đang cố gắng để _teach_ này cho một loạt các sinh viên, và vì họ đã không sử dụng 'matplotlib' trước đây, tôi muốn giữ mọi thứ đơn giản nhất có thể. Ngoài ra, nếu bạn nhìn vào câu trả lời của Rob, câu trả lời của nó đơn giản hơn nhiều so với ví dụ được hiển thị trên trang web. Tôi hy vọng rằng sẽ giúp. –

+0

Tôi cho rằng sử dụng giao diện máy trạng thái làm cho nó _harder_ hiểu được về lâu dài bởi vì phần lớn nó đang được thực hiện 'bằng phép thuật'. Ngoài ra, quy ước là sử dụng 'nhập matplotlib.pyplot thành plt' thay cho' PyPlot' – tacaswell

Trả lời

156

Thêm label= vào mỗi cuộc gọi plot() của bạn và sau đó gọi legend(loc='upper left').

xem xét mẫu này:

import numpy as np 
import pylab 
x = np.linspace(0, 20, 1000) 
y1 = np.sin(x) 
y2 = np.cos(x) 

pylab.plot(x, y1, '-b', label='sine') 
pylab.plot(x, y2, '-r', label='cosine') 
pylab.legend(loc='upper left') 
pylab.ylim(-1.5, 2.0) 
pylab.show() 

enter image description here Hơi sửa đổi từ hướng dẫn này: http://jakevdp.github.io/mpl_tutorial/tutorial_pages/tut1.html

+1

Có cách nào để làm điều này nếu bạn không không biết các nhãn tại thời điểm hàng loạt được vẽ? I E. cách thêm nhãn vào chuỗi sau khi đã được vẽ? Hoặc có thể là một cách để sửa đổi nhãn giữ chỗ trước khi hiển thị chú giải? – meowsqueak

+1

'plt.legend (loc = 'upper left')' cũng hoạt động, trong đó 'plt' là từ' import matplotlib.pyplot as plt'. –

5

Thêm nhãn cho mỗi đối số trong cuộc gọi âm mưu của bạn tương ứng với loạt nó được vẽ đồ thị, ví dụ: label = "series 1"

Sau đó, chỉ cần thêm Pyplot.legend() để dưới cùng của kịch bản của bạn và truyền thuyết sẽ hiển thị các nhãn này.

+0

Đây là ý tưởng đúng, nhưng bạn không bao giờ thêm nhãn để chú giải sẽ trống rỗng – tacaswell

1

Dưới đây là một ví dụ để giúp bạn ra ngoài ...

fig = plt.figure(figsize=(10,5)) 
ax = fig.add_subplot(111) 
ax.set_title('ADR vs Rating (CS:GO)') 
ax.scatter(x=data[:,0],y=data[:,1],label='Data') 
plt.plot(data[:,0], m*data[:,0] + b,color='red',label='Our Fitting 
Line') 
ax.set_xlabel('ADR') 
ax.set_ylabel('Rating') 
ax.legend(loc='best') 
plt.show() 

enter image description here

1

Bạn có thể truy cập cá thể Trục (ax) với plt.gca().Trong trường hợp này, bạn có thể sử dụng

plt.gca().legend() 

Bạn có thể làm điều này bằng cách sử dụng từ khóa label= trong mỗi plt.plot() cuộc gọi của bạn hoặc bằng cách gán nhãn của bạn như một tuple trong legend, như trong ví dụ làm việc này:

import numpy as np 
import matplotlib.pyplot as plt 
x = np.linspace(-0.75,1,100) 
y0 = np.exp(2 + 3*x - 7*x**3) 
y1 = 7-4*np.sin(4*x) 
plt.plot(x,y0,x,y1) 
plt.gca().legend(('y0','y1')) 
plt.show() 

pltGcaLegend

Tuy nhiên, nếu bạn cần truy cập vào dụ Axes hơn một lần, tôi khuyên bạn nên lưu nó vào biến ax với

ax = plt.gca() 

và sau đó gọi ax thay vì plt.gca().

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