Plot sebar dan pemetaan warna dengan Python

91

Saya memiliki berbagai poin x dan y yang disimpan dalam array numpy. Itu mewakili x (t) dan y (t) di mana t = 0 ... T-1

Saya sedang merencanakan plot pencar menggunakan

import matplotlib.pyplot as plt

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

Saya ingin memiliki peta warna yang mewakili waktu (karena itu mewarnai poin tergantung pada indeks dalam array numpy)

Apa cara termudah untuk melakukannya?

Vincent
sumber

Jawaban:

170

Berikut ini contohnya

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

Di sini Anda mengatur warna berdasarkan indeks t, yang hanya berupa array [1, 2, ..., 100]. masukkan deskripsi gambar di sini

Mungkin contoh yang lebih mudah dipahami adalah yang sedikit lebih sederhana

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

masukkan deskripsi gambar di sini

Perhatikan bahwa larik yang Anda lewati ctidak perlu memiliki urutan atau tipe tertentu, yaitu tidak perlu diurutkan atau bilangan bulat seperti dalam contoh ini. Rutin plotting akan menskalakan peta warna sedemikian rupa sehingga nilai minimum / maksimum csesuai dengan bagian bawah / atas peta warna.

Colormaps

Anda dapat mengubah peta warna dengan menambahkan

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

Mengimpor matplotlib.cmadalah opsional karena Anda juga dapat memanggil colormaps cmap="cmap_name". Ada halaman referensi peta warna yang menunjukkan tampilan masing-masing. Ketahuilah juga bahwa Anda dapat membalikkan peta warna hanya dengan menyebutnya sebagai cmap_name_r. Begitu juga

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

akan bekerja. Contohnya adalah "jet_r"atau cm.plasma_r. Berikut adalah contoh dengan 1.5 colormap viridis baru:

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

masukkan deskripsi gambar di sini

Colorbars

Anda dapat menambahkan colorbar dengan menggunakan

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

masukkan deskripsi gambar di sini

Perhatikan bahwa jika Anda menggunakan gambar dan subplot secara eksplisit (mis. fig, ax = plt.subplots()Atau ax = fig.add_subplot(111)), menambahkan bilah warna bisa sedikit lebih melibatkan. Contoh bagus dapat ditemukan di sini untuk satu subplot colorbar dan di sini untuk 2 subplot 1 colorbar .

wflynny.dll
sumber
1
Anda bisa mendapatkan legenda warna dengan plt.colorbar()perintah.
drevicko
Kode tampaknya telah berubah di sini.cmap = cm.colormap_name sekarang harus cmap = cm.cmapname.
Chris
@ cmarti1138 Saya tidak yakin apa yang Anda maksud, cm.colormap_namedan cm.cmapnamebukan variabel aktual di matplotlib.cm; itu hanya pseudocode untuk cm.jetatau cm.veridis_r, dll.
wflynny
Adakah cara untuk mengubah cmapatau cdaftar kurva yang sudah diplot?
Guimoute
10

Untuk menambah jawaban wflynny di atas, Anda dapat menemukan peta warna yang tersedia di sini

Contoh:

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

atau sebagai alternatif,

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

Bilah Warna Subplot

Untuk subplot dengan sebar, Anda dapat mengelabui bilah warna ke sumbu Anda dengan membangun "dapat dipetakan" dengan bantuan gambar sekunder dan kemudian menambahkannya ke plot asli Anda.

Sebagai kelanjutan dari contoh di atas:

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

Sebarkan subplot dengan COLORBAR

Perhatikan bahwa Anda juga akan menampilkan gambar sekunder yang dapat Anda abaikan.

Audelia
sumber