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?

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

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


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


cara membuat bilah warna untuk plot ini?
Maryam Rahmani Moghaddam
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.