thanh màu matplotlib cho phân tán


89

Tôi đang làm việc với dữ liệu có dữ liệu có 3 tham số biểu đồ: x, y, c. Làm cách nào để bạn tạo một giá trị màu tùy chỉnh cho một biểu đồ phân tán?

Mở rộng ví dụ này, tôi đang cố gắng thực hiện:

import matplotlib
import matplotlib.pyplot as plt
cm = matplotlib.cm.get_cmap('RdYlBu')
colors=[cm(1.*i/20) for i in range(20)]
xy = range(20)
plt.subplot(111)
colorlist=[colors[x/2] for x in xy] #actually some other non-linear relationship
plt.scatter(xy, xy, c=colorlist, s=35, vmin=0, vmax=20)
plt.colorbar()
plt.show()

nhưng kết quả là TypeError: You must first set_array for mappable

Câu trả lời:


196

Từ tài liệu matplotlib trên phân tán 1 :

cmap chỉ được sử dụng nếu c là một mảng các float

Vì vậy, colorlist cần phải là một danh sách các float chứ không phải là một danh sách các bộ giá trị như bạn hiện có. plt.colorbar () muốn một đối tượng có thể ánh xạ, như CircleCollection mà plt.scatter () trả về. vmin và vmax sau đó có thể kiểm soát các giới hạn của thanh màu của bạn. Những thứ bên ngoài vmin / vmax nhận được màu sắc của các điểm cuối.

Làm thế nào để điều này làm việc cho bạn?

import matplotlib.pyplot as plt
cm = plt.cm.get_cmap('RdYlBu')
xy = range(20)
z = xy
sc = plt.scatter(xy, xy, c=z, vmin=0, vmax=20, s=35, cmap=cm)
plt.colorbar(sc)
plt.show()

Ví dụ hình ảnh


Tôi đã thử nó và nhận được 'AxesSubplot' object has no attribute 'colorbar'. Tôi đã làm xong ax.colorbar()... tôi đang làm gì sai?
Lucas Aimaretto

Ví dụ này không cung cấp một ứng dụng rõ ràng khi sử dụng giao diện matplotlib OOP: matplotlib.org/gallery/api/agg_oo_sgskip.html
Ryszard Cetnarski

18

Đây là cách OOP để thêm thanh màu:

fig, ax = plt.subplots()
im = ax.scatter(x, y, c=c)
fig.colorbar(im, ax=ax)

Khi tôi làm điều này, tôi kết thúc với việc bán lại hoàn toàn cốt truyện sao cho tất cả các điểm nằm trong một phần nhỏ của âm mưu ở ngoài cùng bên phải và thanh màu là một đường rất mảnh ở phía dưới.
Marses

Câu trả lời đúng, plttôi nghĩ trực tiếp sử dụng để vẽ thanh màu không phải là cách được khuyến khích. Của bạn là một cách khen ngợi.
GoingMyWay

2

Nếu bạn đang muốn phân tán theo hai biến số và màu sắc theo thứ ba, Altair có thể là một lựa chọn tuyệt vời.

Tạo tập dữ liệu

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

df = pd.DataFrame(40*np.random.randn(10, 3), columns=['A', 'B','C'])

Âm mưu Altair

from altair import *
Chart(df).mark_circle().encode(x='A',y='B', color='C').configure_cell(width=200, height=150)

Âm mưu

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

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.