Scatterplot Matplotlib; warna sebagai fungsi dari variabel ketiga

152

Saya ingin membuat scatterplot (menggunakan matplotlib) di mana titik-titik diarsir menurut variabel ketiga. Saya sudah sangat dekat dengan ini:

plt.scatter(w, M, c=p, marker='s')

di mana w dan M adalah datapoints dan p adalah variabel yang ingin saya beri naungan.
Namun saya ingin melakukannya dalam skala abu-abu daripada warna. Adakah yang bisa membantu?

Thomas Collett
sumber

Jawaban:

156

Tidak perlu mengatur warna secara manual. Sebagai gantinya, tentukan colormap grayscale ...

import numpy as np
import matplotlib.pyplot as plt

# Generate data...
x = np.random.random(10)
y = np.random.random(10)

# Plot...
plt.scatter(x, y, c=y, s=500)
plt.gray()

plt.show()

masukkan deskripsi gambar di sini

Atau, jika Anda lebih suka rentang colormaps yang lebih luas , Anda juga dapat menentukan cmapkwarg scatter. Untuk menggunakan versi yang dibalik dari semua ini, cukup tentukan versi " _r" dari salah satunya. Misalnya gray_rbukannya gray. Ada beberapa colormaps grayscale berbeda pra-dibuat (misalnya gray, gist_yarg, binary, dll).

import matplotlib.pyplot as plt
import numpy as np

# Generate data...
x = np.random.random(10)
y = np.random.random(10)

plt.scatter(x, y, c=y, s=500, cmap='gray')
plt.show()
Joe Kington
sumber
1
Terima kasih! Apakah ada cara menggambar kontur di sekitar titik-titik ini yang mengandung jumlah tertentu dari berat total?
Thomas Collett
6
mpl.cmjuga tersedia langsung sebagai plt.cm.
heltonbiker
@ Thomas Collet: Jika Anda ingin menggambar kontur, Anda harus menginterpolasi data dari titik-titik ke matriks 2D, lalu plot yang menggunakan plt.contour()atau plt.contourf()- tapi itu pertanyaan yang berbeda
Zak
Bagaimana Anda bisa menambahkan label dalam legenda? Dalam hal ini dengan angka kontinu, saya curiga Anda akan menggunakan colorbar. Bagaimana dengan dalam kasus nilai diskrit? misalnya, bisakah saya menambahkan 3 label dalam legenda untuk tiga kategori saya?
Nate
26

Dalam matplotlib, warna abu-abu dapat diberikan sebagai string dengan nilai numerik antara 0-1.
Sebagai contohc = '0.1'

Kemudian Anda bisa mengonversi variabel ketiga Anda dalam nilai di dalam rentang ini dan menggunakannya untuk mewarnai poin Anda.
Dalam contoh berikut ini saya menggunakan posisi y titik sebagai nilai yang menentukan warna:

from matplotlib import pyplot as plt

x = [1, 2, 3, 4, 5, 6, 7, 8, 9]
y = [125, 32, 54, 253, 67, 87, 233, 56, 67]

color = [str(item/255.) for item in y]

plt.scatter(x, y, s=500, c=color)

plt.show()

masukkan deskripsi gambar di sini

joaquin
sumber
3
Sebagai catatan, Anda bisa menerapkan ALPHA sebagai colormap jika Anda memberikan array berbentuk (n, 4) sebagai cargumen, dengan nilai alpha di kolom keempat. Jika variabel ketiga adalah Z, dengan shape=(n,1), maka colors = numpy.hstack((numpy.zeros_like(z), numpy.zeros_like(z), numpy.ones_like(z), z/z.max()))memberikan efek yang sangat bagus (tentu saja bisa di-tweak).
heltonbiker
Saya mendapatkan kesalahan: 'panjang urutan rgba harus 3 atau 4'
MattCochrane
1
@MattClimbs Saya menduga Anda memanggil plt.plot daripada plt.scatter seperti pada contoh.
smashbro
bagaimana Anda menambahkan colorbar ke plot ini?
FaCoffee
2
@FaCoffee plt.colorbar()akan melakukan itu
Mathew Savage
10

Terkadang Anda mungkin perlu membuat plot warna dengan tepat berdasarkan case x-value . Misalnya, Anda mungkin memiliki kerangka data dengan 3 jenis variabel dan beberapa titik data. Dan Anda ingin melakukan hal berikut,

  • Plot poin sesuai dengan variabel Fisik 'A' dalam RED.
  • Plot poin sesuai dengan variabel Fisik 'B' dalam BIRU.
  • Plot poin sesuai dengan variabel Fisik 'C' di GREEN.

Dalam hal ini, Anda mungkin harus menulis ke fungsi pendek untuk memetakan nilai x ke nama warna yang sesuai sebagai daftar dan kemudian meneruskan daftar itu ke plt.scatterperintah.

x=['A','B','B','C','A','B']
y=[15,30,25,18,22,13]

# Function to map the colors as a list from the input list of x variables
def pltcolor(lst):
    cols=[]
    for l in lst:
        if l=='A':
            cols.append('red')
        elif l=='B':
            cols.append('blue')
        else:
            cols.append('green')
    return cols
# Create the colors list using the function above
cols=pltcolor(x)

plt.scatter(x=x,y=y,s=500,c=cols) #Pass on the list created by the function here
plt.grid(True)
plt.show()

Pewarnaan plot sebaran sebagai fungsi dari x variabel

Tirtha
sumber
cara membuat bilah warna untuk plot ini?
Maryam Rahmani Moghaddam