matplotlib colorbar สำหรับกระจาย


92

ฉันกำลังทำงานกับข้อมูลที่มีข้อมูลที่มีพารามิเตอร์การพล็อต 3 พารามิเตอร์: x, y, c คุณสร้างค่าสีที่กำหนดเองสำหรับพล็อตกระจายได้อย่างไร

การขยายตัวอย่างนี้ฉันกำลังพยายามทำ:

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()

แต่ผลลัพธ์คือ TypeError: You must first set_array for mappable

คำตอบ:


201

จากเอกสาร matplotlib บน scatter 1 :

cmap จะใช้เฉพาะในกรณีที่ c เป็นอาร์เรย์ของโฟลต

ดังนั้นรายการสีจะต้องเป็นรายการลอยมากกว่ารายการสิ่งที่คุณมีในตอนนี้ plt.colorbar () ต้องการวัตถุที่แมปได้เช่น CircleCollection ที่ plt.scatter () ส่งกลับ vmin และ vmax สามารถควบคุมขีด จำกัด ของ colorbar ของคุณได้ สิ่งที่อยู่ภายนอก vmin / vmax ได้รับสีของจุดสิ้นสุด

วิธีนี้เหมาะกับคุณอย่างไร?

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()

ตัวอย่างรูปภาพ


'AxesSubplot' object has no attribute 'colorbar'ฉันพยายามมันและได้ ฉันทำไปแล้วax.colorbar()... ฉันทำอะไรผิด?
Lucas Aimaretto

ตัวอย่างนี้ไม่ได้ระบุแอปพลิเคชันที่ชัดเจนเมื่อใช้อินเตอร์เฟส matplotlib OOP: matplotlib.org/gallery/api/agg_oo_sgskip.html
Ryszard Cetnarski

20

นี่คือวิธี OOP ในการเพิ่มแถบสี:

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

เมื่อฉันทำสิ่งนี้ฉันจะจบลงด้วยการปรับขนาดใหม่ทั้งหมดเพื่อให้จุดทั้งหมดอยู่ในเศษเสี้ยวของพล็อตทางด้านขวาสุดและแถบสีเป็นเส้นบาง ๆ ที่ด้านล่าง
Marses

คำตอบที่ถูกต้องโดยใช้pltพล็อตแถบสีโดยตรงไม่ใช่วิธีที่แนะนำ คุณเป็นวิธีที่น่ายกย่อง
GoingMyWay

2

หากคุณต้องการกระจายสองตัวแปรและสีโดยตัวแปรที่สามAltairเป็นตัวเลือกที่ดี

การสร้างชุดข้อมูล

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'])

พล็อต Altair

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

พล็อต

ป้อนคำอธิบายภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.