Phân tán Matplotlib; màu sắc như là một hàm của biến thứ ba


152

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

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

Trong đó w và M là các điểm dữ liệu và p là biến tôi muốn tô màu đối với.
Tuy nhiên tôi muốn làm điều đó trong thang độ xám hơn là màu sắc. Có ai giúp được không?

Câu trả lời:


156

Không cần phải tự thiết lập 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()

nhập mô tả hình ảnh ở đây

Hoặc, nếu bạn thích một phạm vi rộng hơn , bạn cũng có thể chỉ định cmapkwarg scatter. Để sử dụng phiên bản đảo ngược của bất kỳ trong số này, chỉ cần chỉ định _rphiên bản "" của bất kỳ trong số chúng. Ví dụ gray_rthay vì gray. Có một số colormaps màu xám khác nhau trước khi thực hiện (ví dụ gray, gist_yarg, binary, vv).

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ó cách nào để vẽ các đường viền quanh các điểm này chứa một lượng nhất định của tổng trọng lượng không?
Thomas Collett

6
mpl.cmcũng có sẵn trực tiếp như plt.cm.
heltonbiker

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

Làm thế nào bạn có thể thêm nhãn trong truyền thuyết? Trong trường hợp này với số liên tục, tôi nghi ngờ bạn sẽ sử dụng thanh màu. Còn trong trường hợp giá trị rời rạc thì sao? ví dụ: tôi có thể thêm 3 nhãn trong chú giải cho ba danh mục của mình không?
Nate

26

Trong màu xám matplotlib có thể được đưa ra dưới dạng một chuỗi có giá trị bằng số trong khoảng 0-1.
Ví dục = '0.1'

Sau đó, bạn có thể chuyển đổi biến thứ ba của mình trong một giá trị trong phạm vi này và sử dụng nó để tô màu cho điểm của bạn.
Trong ví dụ sau tôi đã sử dụng vị trí y của điểm làm giá trị 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()

nhập mô tả hình ảnh ở đây


3
Đối với bản ghi, bạn có thể áp dụng ALPHA dưới dạng một bản đồ màu nếu bạn cung cấp một mảng có hình (n, 4) làm cđối số, với các 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 hiệu ứng rất đẹp (tất nhiên nó có thể được điều chỉnh).
heltonbiker

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

1
@MattClimbs Tôi nghi ngờ bạn đang gọi plt.plot chứ không phải plt.scatter như trong ví dụ.
smashbro

Làm thế nào để bạn thêm một thanh màu cho cốt truyện này?
FaCoffee

2
@FaCoffee plt.colorbar()sẽ làm điều đó
Mathew Savage

10

Đôi khi bạn có thể cần vẽ màu chính xác dựa trên trường hợp giá trị x . Ví dụ: bạn có thể có một khung dữ liệu với 3 loại biến và một số điểm dữ liệu. Và bạn muốn làm theo,

  • Vẽ các điểm tương ứng với biến vật lý 'A' trong ĐỎ.
  • Vẽ các điểm tương ứng với biến vật lý 'B' trong BLUE.
  • Vẽ các điểm tương ứng với biến vật lý 'C' trong XANH.

Trong trường hợp này, bạn có thể phải ghi vào hàm ngắn để ánh xạ các giá trị x thành các tên màu tương ứng dưới dạng danh sách và sau đó chuyển danh sách đó vào plt.scatterlệnh.

x=['A','B','B','C','A','B']
y=[15,30,25,18,22,13]

# Function to map the colors as a list from the input list of x variables
def pltcolor(lst):
    cols=[]
    for l in lst:
        if l=='A':
            cols.append('red')
        elif l=='B':
            cols.append('blue')
        else:
            cols.append('green')
    return cols
# Create the colors list using the function above
cols=pltcolor(x)

plt.scatter(x=x,y=y,s=500,c=cols) #Pass on the list created by the function here
plt.grid(True)
plt.show()

Vẽ biểu đồ phân tán màu như là một hàm của biến x


Làm thế nào để tạo một thanh màu cho cốt truyện này?
Maryam Rahmani Moghaddam
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.