Python'da dağılım grafiği ve Renk eşleme


91

Numpy dizilerinde depolanan bir dizi x ve y noktaları var. Bunlar x (t) ve y (t) 'yi temsil eder, burada t = 0 ... T-1

Kullanarak bir dağılım grafiği çiziyorum

import matplotlib.pyplot as plt

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

Zamanı temsil eden bir renk haritasına sahip olmak istiyorum (bu nedenle, numpy dizilerindeki indekse bağlı olarak noktaları renklendirmek)

Bunu yapmanın en kolay yolu nedir?

Yanıtlar:


170

İşte bir örnek

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

Burada rengi dizine göre ayarlıyorsunuz t, bu sadece bir dizi [1, 2, ..., 100]. görüntü açıklamasını buraya girin

Belki anlaşılması daha kolay bir örnek, biraz daha basittir.

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

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

Geçtiğiniz dizinin cbelirli bir sıraya veya türe sahip olması gerekmediğini, yani bu örneklerde olduğu gibi sıralanması veya tamsayı olması gerekmediğini unutmayın. Çizim rutini, renk haritasını, minimum / maksimum değerler crenk haritasının altına / üstüne karşılık gelecek şekilde ölçekleyecektir .

Colormaps

Renk haritasını ekleyerek değiştirebilirsiniz.

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

matplotlib.cmRenk haritalarını da çağırabildiğiniz için içe aktarma isteğe bağlıdır cmap="cmap_name". Her birinin neye benzediğini gösteren renk haritalarının bir referans sayfası var . Ayrıca, bir renk haritasını sadece olarak adlandırarak tersine çevirebileceğinizi de bilin cmap_name_r. Bu yüzden ya

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

çalışacak. Örnekler "jet_r"veya cm.plasma_r. İşte yeni 1.5 renk haritalı viridis ile bir örnek:

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

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

Renk çubukları

Kullanarak bir renk çubuğu ekleyebilirsiniz.

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

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

Açıkça rakamlar ve alt grafikler kullanıyorsanız (örneğin fig, ax = plt.subplots()veya ax = fig.add_subplot(111)), bir renk çubuğu eklemenin biraz daha karmaşık olabileceğini unutmayın. İyi örnekler burada tek bir alt grafik renk çubuğu için ve burada 2 alt grafik 1 renk çubuğu için bulunabilir .


1
plt.colorbar()Komut ile renkler için bir lejant elde edebilirsiniz .
drevicko

Kod burada değişmiş gibi görünüyor. Cmap = cm.colormap_name şimdi cmap = cm.cmapname olmalıdır.
Chris

@ cmarti1138 Ne demek istediğinizden emin değilim cm.colormap_nameve içindeki cm.cmapnamegerçek değişkenler değil matplotlib.cm; bu sadece cm.jetveya cm.veridis_r, vb. için sözde
koddur

Önceden çizilen bir eğrinin listesini cmapveya clistesini değiştirmenin bir yolu var mı ?
Guimoute

10

Yukarıdaki wflynny'nin cevabına eklemek için, mevcut renk haritalarını burada bulabilirsiniz.

Misal:

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

Veya alternatif olarak,

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

3

Alt Grafik Renk Çubuğu

Dağılımlı alt grafikler için, ikincil bir figür yardımıyla "eşlenebilir" oluşturup ardından orijinal grafiğinize ekleyerek bir renk çubuğunu eksenlerinize kandırabilirsiniz.

Yukarıdaki örneğin devamı olarak:

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

Alt grafikleri COLORBAR ile dağıtın

Ayrıca görmezden gelebileceğiniz ikincil bir rakam da vereceğinizi unutmayın.

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.