dağılım için matplotlib colorbar


92

Verilerin 3 çizim parametresi olan verilerle çalışıyorum: x, y, c. Bir dağılım grafiği için nasıl özel bir renk değeri yaratırsınız?

Bu örneği genişleterek yapmaya çalışıyorum:

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

ama sonuç TypeError: You must first set_array for mappable

Yanıtlar:


201

Dağılım 1'deki matplotlib belgelerinden :

cmap yalnızca c bir kayan dizi ise kullanılır

Bu nedenle, renk listesinin, şu anda sahip olduğunuz gibi bir tuple listesi yerine bir kayan liste listesi olması gerekir. plt.colorbar (), plt.scatter () 'ın döndürdüğü CircleCollection gibi eşlenebilir bir nesne ister. vmin ve vmax daha sonra renk çubuğunuzun sınırlarını kontrol edebilir. Vmin / vmax dışındaki şeyler uç noktaların renklerini alır.

Bu sizin için nasıl çalışıyor?

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

Resim Örneği


Denedim ve aldım 'AxesSubplot' object has no attribute 'colorbar'. Ben ax.colorbar()... neyi yanlış yapıyorum?
Lucas Aimaretto

Bu örnek, matplotlib OOP arayüzünü kullanırken net bir uygulama sağlamaz: matplotlib.org/gallery/api/agg_oo_sgskip.html
Ryszard Cetnarski

20

İşte OOP yolu bir Colorbar ekleme:

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

Bunu yaptığımda, arsa tamamen yeniden ölçeklendirilir, böylece tüm noktalar en sağdaki grafiğin bir şeridi içinde olur ve renk çubuğu altta çok ince bir çizgi olur.
Marses

Doğru yanıt, doğrudan pltrenk çubuğunu çizmek için kullanılması önerilen bir yol değil diye düşünüyorum. Seninki övgüye değer bir yol.
GoingMyWay

2

Üçüncüye göre iki değişkene ve renge göre dağılım istiyorsanız, Altair harika bir seçim olabilir.

Veri kümesini oluşturma

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 arsa

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

Arsa

görüntü açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.