Biểu đồ phân tán và ánh xạ màu trong Python


91

Tôi có một loạt các điểm x và y được lưu trữ trong các mảng nhỏ. Chúng đại diện cho x (t) và y (t) trong đó t = 0 ... T-1

Tôi đang vẽ một âm mưu phân tán bằng cách sử dụng

import matplotlib.pyplot as plt

plt.scatter(x,y)
plt.show()

Tôi muốn có một bản đồ màu đại diện cho thời gian (do đó tô màu các điểm tùy thuộc vào chỉ số trong các mảng không có hạt)

Cách dễ nhất để làm như vậy là gì?

Câu trả lời:


169

Đây là một ví dụ

import numpy as np
import matplotlib.pyplot as plt

x = np.random.rand(100)
y = np.random.rand(100)
t = np.arange(100)

plt.scatter(x, y, c=t)
plt.show()

Ở đây bạn đang thiết lập màu dựa trên chỉ số, tchỉ là một mảng của [1, 2, ..., 100]. nhập mô tả hình ảnh ở đây

Có lẽ một ví dụ dễ hiểu hơn là đơn giản hơn một chút

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(100)
y = x
t = x
plt.scatter(x, y, c=t)
plt.show()

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

Lưu ý rằng mảng bạn truyền vào ckhông cần có bất kỳ thứ tự hoặc kiểu cụ thể nào, tức là nó không cần được sắp xếp hoặc số nguyên như trong các ví dụ này. Quy trình vẽ biểu đồ sẽ chia tỷ lệ bản đồ màu sao cho các giá trị tối thiểu / tối đa ctương ứng với phần dưới / trên cùng của bản đồ màu.

Colormaps

Bạn có thể thay đổi bản đồ màu bằng cách thêm

import matplotlib.cm as cm
plt.scatter(x, y, c=t, cmap=cm.cmap_name)

Nhập matplotlib.cmlà tùy chọn vì bạn cũng có thể gọi các bản đồ màu cmap="cmap_name". Có một trang tham khảo gồm các bản đồ màu hiển thị mỗi bản đồ trông như thế nào. Cũng nên biết rằng bạn có thể đảo ngược một bản đồ màu bằng cách chỉ cần gọi nó là cmap_name_r. Vì vậy

plt.scatter(x, y, c=t, cmap=cm.cmap_name_r)
# or
plt.scatter(x, y, c=t, cmap="cmap_name_r")

sẽ làm việc. Ví dụ là "jet_r"hoặc cm.plasma_r. Đây là một ví dụ với viridis bản đồ màu 1.5 mới:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(100)
y = x
t = x
fig, (ax1, ax2) = plt.subplots(1, 2)
ax1.scatter(x, y, c=t, cmap='viridis')
ax2.scatter(x, y, c=t, cmap='viridis_r')
plt.show()

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

Thanh màu

Bạn có thể thêm một thanh màu bằng cách sử dụng

plt.scatter(x, y, c=t, cmap='viridis')
plt.colorbar()
plt.show()

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

Lưu ý rằng nếu bạn đang sử dụng các số liệu và biểu đồ con một cách rõ ràng (ví dụ fig, ax = plt.subplots()hoặc ax = fig.add_subplot(111)), việc thêm thanh màu có thể liên quan nhiều hơn một chút. Bạn có thể tìm thấy các ví dụ tốt ở đây cho một thanh màu ô con duy nhấtđây cho 2 ô màu con 1 ô màu .


1
Bạn có thể nhận được chú giải cho các màu bằng plt.colorbar()lệnh.
drevicko

Mã dường như đã thay đổi ở đây .cmap = cm.colormap_name bây giờ phải là cmap = cm.cmapname.
Chris

@ cmarti1138 Tôi không chắc ý của bạn cm.colormap_namecm.cmapnamekhông phải là các biến thực tế trong matplotlib.cm; nó chỉ là mã giả cho cm.jethoặc cm.veridis_r, v.v.
wflynny

Có cách nào để thay đổi cmaphoặc cdanh sách của một đường cong đã được vẽ không?
Guimoute

10

Để thêm vào câu trả lời của wflynny ở trên, bạn có thể tìm các bản đồ màu có sẵn tại đây

Thí dụ:

import matplotlib.cm as cm
plt.scatter(x, y, c=t, cmap=cm.jet)

Hay cách khác,

plt.scatter(x, y, c=t, cmap='jet')

3

Thanh màu ô con

Đối với các ô con có phân tán, bạn có thể đánh lừa một thanh màu lên các trục của mình bằng cách xây dựng "có thể lập bản đồ" với sự trợ giúp của một hình phụ và sau đó thêm nó vào ô ban đầu của bạn.

Như một phần tiếp theo của ví dụ trên:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(10)
y = x
t = x
fig, (ax1, ax2) = plt.subplots(1, 2)
ax1.scatter(x, y, c=t, cmap='viridis')
ax2.scatter(x, y, c=t, cmap='viridis_r')


# Build your secondary mirror axes:
fig2, (ax3, ax4) = plt.subplots(1, 2)

# Build maps that parallel the color-coded data
# NOTE 1: imshow requires a 2-D array as input
# NOTE 2: You must use the same cmap tag as above for it match
map1 = ax3.imshow(np.stack([t, t]),cmap='viridis')
map2 = ax4.imshow(np.stack([t, t]),cmap='viridis_r')

# Add your maps onto your original figure/axes
fig.colorbar(map1, ax=ax1)
fig.colorbar(map2, ax=ax2)
plt.show()

Phân tán các ô con với COLORBAR

Lưu ý rằng bạn cũng sẽ xuất ra một con số phụ mà bạn có thể bỏ qua.

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.