2011-11-20 33 views
100

Tôi muốn tạo một phân tán (sử dụng matplotlib) trong đó các điểm được tô bóng theo biến thứ ba. Tôi đã rất gần với điều này:Matplotlib scatterplot; màu là hàm của biến số thứ ba

plt.scatter(w, M, c=p, marker='s') 

trong đó w và M là datapoints và p là biến tôi muốn tô bóng liên quan.
Tuy nhiên tôi muốn làm điều đó trong thang độ xám hơn là màu. Có ai giúp được không?

Trả lời

19

Trong màu xám matplotlib có thể được xem như một chuỗi có giá trị bằng số từ 0-1.
Ví dụ: c = '0.1'

Sau đó, bạn có thể chuyển đổi biến thứ ba của mình thành giá trị bên trong phạm vi này và sử dụng biến đó để tô màu điểm của bạn.
Trong ví dụ sau tôi đã sử dụng vị trí y của điểm như giá trị mà xác định màu:

from matplotlib import pyplot as plt 

x = [1, 2, 3, 4, 5, 6, 7, 8, 9] 
y = [125, 32, 54, 253, 67, 87, 233, 56, 67] 

color = [str(item/255.) for item in y] 

plt.scatter(x, y, s=500, c=color) 

plt.show() 

enter image description here

+2

Để lưu bản ghi, bạn có thể áp dụng ALPHA làm bản đồ màu nếu bạn cung cấp mảng (n, 4) dạng đối số 'c', với giá trị alpha trong cột thứ tư. Nếu biến thứ ba là Z, với 'shape = (n, 1)', thì 'colors = numpy.hstack ((numpy.zeros_like (z), numpy.zeros_like (z), numpy.ones_like (z), z/z .max())) 'cho một hiệu ứng rất đẹp (tất nhiên nó có thể được tinh chỉnh). – heltonbiker

+1

tại sao downvote? – joaquin

+0

Tôi gặp lỗi: 'độ dài của chuỗi rgba phải là 3 hoặc 4' – MattClimbs

101

Không cần phải tự thiết lập các màu sắc. Thay vào đó, chỉ định một bản đồ màu xám ...

import numpy as np 
import matplotlib.pyplot as plt 

# Generate data... 
x = np.random.random(10) 
y = np.random.random(10) 

# Plot... 
plt.scatter(x, y, c=y, s=500) 
plt.gray() 

plt.show() 

enter image description here

Hoặc, nếu bạn muốn một wider range of colormaps, bạn cũng có thể chỉ định cmap kwarg để scatter. Để sử dụng phiên bản đảo ngược của bất kỳ phiên bản nào trong số này, chỉ cần chỉ định phiên bản "_r" của bất kỳ phiên bản nào trong số này. Ví dụ. gray_r thay vì gray. Có một số bản đồ màu xám khác nhau được tạo sẵn (ví dụ: gray, gist_yarg, binary, v.v ...).

import matplotlib.pyplot as plt 
import numpy as np 

# Generate data... 
x = np.random.random(10) 
y = np.random.random(10) 

plt.scatter(x, y, c=y, s=500, cmap='gray') 
plt.show() 
+1

Cảm ơn! Có anyway để vẽ đường nét vòng những điểm có chứa một số tiền nhất định của tổng trọng lượng? –

+6

'mpl.cm' cũng có sẵn trực tiếp dưới dạng' plt.cm'. – heltonbiker

+0

@Thomas Collet: Nếu bạn muốn vẽ các đường bao, bạn cần phải nội suy dạng dữ liệu các điểm thành ma trận 2D, sau đó vẽ đồ thị bằng cách sử dụng 'plt.contour()' hoặc 'plt.contourf()' - nhưng đó là một câu hỏi khác nhau – Zak

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