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.