2013-07-01 36 views
34

Tôi đã tạo biểu đồ đồ thị phân tán 4D để biểu thị các nhiệt độ khác nhau trong một khu vực cụ thể. Khi tôi tạo chú thích, chú giải cho thấy biểu tượng và màu sắc chính xác nhưng thêm một dòng thông qua nó. Mã Tôi đang sử dụng là:Matplotlib scatter plot legend

colors=['b', 'c', 'y', 'm', 'r'] 
lo = plt.Line2D(range(10), range(10), marker='x', color=colors[0]) 
ll = plt.Line2D(range(10), range(10), marker='o', color=colors[0]) 
l = plt.Line2D(range(10), range(10), marker='o',color=colors[1]) 
a = plt.Line2D(range(10), range(10), marker='o',color=colors[2]) 
h = plt.Line2D(range(10), range(10), marker='o',color=colors[3]) 
hh = plt.Line2D(range(10), range(10), marker='o',color=colors[4]) 
ho = plt.Line2D(range(10), range(10), marker='x', color=colors[4]) 
plt.legend((lo,ll,l,a, h, hh, ho),('Low Outlier', 'LoLo','Lo', 'Average', 'Hi', 'HiHi', 'High Outlier'),numpoints=1, loc='lower left', ncol=3, fontsize=8) 

tôi đã cố gắng thay đổi Line2D-Scatterscatter. Scatter trả về lỗi và scatter thay đổi biểu đồ và trả lại lỗi.

Với scatter, tôi đã thay đổi range(10) thành danh sách chứa các điểm dữ liệu. Mỗi danh sách chứa biến x, y hoặc z.

lo = plt.scatter(xLOutlier, yLOutlier, zLOutlier, marker='x', color=colors[0]) 
ll = plt.scatter(xLoLo, yLoLo, zLoLo, marker='o', color=colors[0]) 
l = plt.scatter(xLo, yLo, zLo, marker='o',color=colors[1]) 
a = plt.scatter(xAverage, yAverage, zAverage, marker='o',color=colors[2]) 
h = plt.scatter(xHi, yHi, zHi, marker='o',color=colors[3]) 
hh = plt.scatter(xHiHi, yHiHi, zHiHi, marker='o',color=colors[4]) 
ho = plt.scatter(xHOutlier, yHOutlier, zHOutlier, marker='x', color=colors[4]) 
plt.legend((lo,ll,l,a, h, hh, ho),('Low Outlier', 'LoLo','Lo', 'Average', 'Hi', 'HiHi',  'High Outlier'),scatterpoints=1, loc='lower left', ncol=3, fontsize=8) 

Khi tôi chạy điều này, chú giải không còn tồn tại nữa, nó là một ô nhỏ màu trắng ở góc không có gì trong đó.

Bạn có lời khuyên nào không?

+0

Tôi tin rằng một giải pháp tốt hơn được đưa ra [ở đây] (http://stackoverflow.com/questions/21654635/scatter-plots-in-pandas-pyplot-how-to-plot -by-category). – dmvianna

Trả lời

82

đồ phân tán 2D

Sử dụng phương pháp scatter của module matplotlib.pyplot nên làm việc (ít nhất là với matplotlib 1.2.1 với Python 2.7.5), như trong đoạn mã ví dụ dưới đây. Ngoài ra, nếu bạn đang sử dụng ô phân tán, hãy sử dụng scatterpoints=1 thay vì numpoints=1 trong cuộc gọi chú thích để chỉ có một điểm cho mỗi mục nhập chú giải.

Trong mã bên dưới, tôi đã sử dụng các giá trị ngẫu nhiên thay vì vẽ cùng một phạm vi nhiều lần, làm cho tất cả các ô hiển thị (tức là không trùng nhau).

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

colors = ['b', 'c', 'y', 'm', 'r'] 

lo = plt.scatter(random(10), random(10), marker='x', color=colors[0]) 
ll = plt.scatter(random(10), random(10), marker='o', color=colors[0]) 
l = plt.scatter(random(10), random(10), marker='o', color=colors[1]) 
a = plt.scatter(random(10), random(10), marker='o', color=colors[2]) 
h = plt.scatter(random(10), random(10), marker='o', color=colors[3]) 
hh = plt.scatter(random(10), random(10), marker='o', color=colors[4]) 
ho = plt.scatter(random(10), random(10), marker='x', color=colors[4]) 

plt.legend((lo, ll, l, a, h, hh, ho), 
      ('Low Outlier', 'LoLo', 'Lo', 'Average', 'Hi', 'HiHi', 'High Outlier'), 
      scatterpoints=1, 
      loc='lower left', 
      ncol=3, 
      fontsize=8) 

plt.show() 

enter image description here

phân tán 3D cốt truyện

Để vẽ một phân tán trong không gian 3D, sử dụng phương pháp plot, như huyền thoại không hỗ trợ Patch3DCollection như được trả về bởi phương pháp scatter của một thể hiện Axes3D. Để chỉ định kiểu đánh dấu, bạn có thể đưa nó vào như một đối số vị trí trong lời gọi phương thức, như được thấy trong ví dụ bên dưới. Một tùy chọn có thể bao gồm đối số cho cả thông số linestyle và .

import matplotlib.pyplot as plt 
from numpy.random import random 
from mpl_toolkits.mplot3d import Axes3D 

colors=['b', 'c', 'y', 'm', 'r'] 

ax = plt.subplot(111, projection='3d') 

ax.plot(random(10), random(10), random(10), 'x', color=colors[0], label='Low Outlier') 
ax.plot(random(10), random(10), random(10), 'o', color=colors[0], label='LoLo') 
ax.plot(random(10), random(10), random(10), 'o', color=colors[1], label='Lo') 
ax.plot(random(10), random(10), random(10), 'o', color=colors[2], label='Average') 
ax.plot(random(10), random(10), random(10), 'o', color=colors[3], label='Hi') 
ax.plot(random(10), random(10), random(10), 'o', color=colors[4], label='HiHi') 
ax.plot(random(10), random(10), random(10), 'x', color=colors[4], label='High Outlier') 

plt.legend(loc='upper left', numpoints=1, ncol=3, fontsize=8, bbox_to_anchor=(0, 0)) 

plt.show() 

enter image description here

+0

Tính năng này có hoạt động cho các ô phân tán 3D không? – user2386081

+1

Để làm cho chú giải hoạt động khi vẽ bản phân tán 3D, sử dụng phương thức 'lô' với điểm đánh dấu làm đối số vị trí. Xem chỉnh sửa. – hooy