Matplotlib scatterplot; color เป็นฟังก์ชันของตัวแปรตัวที่สาม


152

ฉันต้องการสร้าง scatterplot (โดยใช้ matplotlib) ซึ่งเป็นจุดที่แรเงาตามตัวแปรตัวที่สาม ฉันสนิทกับสิ่งนี้มาก:

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

โดยที่ w และ M เป็นดาต้าพอยน์และ p เป็นตัวแปรที่ฉันต้องการแรเงาด้วยความเคารพ
อย่างไรก็ตามฉันต้องการที่จะทำมันในเฉดสีเทามากกว่าสี ใครช่วยได้บ้าง

คำตอบ:


156

ไม่จำเป็นต้องตั้งค่าสีด้วยตนเอง ให้ระบุ colormap สีเทาแทน ...

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

ป้อนคำอธิบายรูปภาพที่นี่

หรือหากคุณต้องการช่วงกว้างของ colormapsคุณยังสามารถระบุcmapkwarg scatterไป หากต้องการใช้เวอร์ชันที่กลับด้านของสิ่งเหล่านี้เพียงระบุ_rเวอร์ชัน "" ของสิ่งเหล่านี้ เช่นแทนgray_r grayมีหลาย colormaps สีเทาที่แตกต่างกันที่ทำไว้ล่วงหน้าเป็น (เช่นgray, gist_yarg, binaryฯลฯ )

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
ขอบคุณ! อย่างไรก็ตามมีการวาดรูปทรงรอบจุดเหล่านี้ที่มีจำนวนน้ำหนักรวม?
Thomas Collett

6
mpl.cmplt.cmนอกจากนี้ยังสามารถใช้ได้โดยตรงเป็น
heltonbiker

@Thomas Collet: หากคุณต้องการวาดรูปทรงคุณจะต้องแก้ไขข้อมูลในรูปแบบของคะแนนไปเป็นเมทริกซ์ 2D จากนั้นให้พล็อตที่ใช้plt.contour()หรือplt.contourf()- แต่นั่นเป็นคำถามที่แตกต่าง
Zak

คุณจะเพิ่มป้ายกำกับในคำอธิบายได้อย่างไร ในกรณีนี้มีตัวเลขต่อเนื่องฉันสงสัยว่าคุณจะใช้แถบสี ในกรณีของค่าที่ไม่ต่อเนื่อง? เช่นฉันจะเพิ่ม 3 ป้ายกำกับในตำนานสำหรับสามหมวดหมู่ของฉันได้หรือไม่
เนท

26

ในสีเทา matplotlib สามารถกำหนดเป็นสตริงของค่าตัวเลขระหว่าง 0-1
ตัวอย่างเช่นc = '0.1'

จากนั้นคุณสามารถแปลงตัวแปรตัวที่สามของคุณเป็นค่าภายในช่วงนี้และใช้มันเพื่อแต้มสีของคุณ
ในตัวอย่างต่อไปนี้ฉันใช้ตำแหน่ง y ของจุดเป็นค่าที่กำหนดสี:

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

ป้อนคำอธิบายรูปภาพที่นี่


3
สำหรับบันทึกคุณสามารถใช้ ALPHA เป็น colormap ได้หากคุณระบุอาร์เรย์ที่มีรูปร่าง (n, 4) เป็นcอาร์กิวเมนต์โดยมีค่าอัลฟาในคอลัมน์ที่สี่ ถ้าตัวแปรที่สามคือ Z ด้วยshape=(n,1)แล้ว colors = numpy.hstack((numpy.zeros_like(z), numpy.zeros_like(z), numpy.ones_like(z), z/z.max()))ให้ผลดีมาก (แน่นอนมันสามารถ tweaked)
heltonbiker

ฉันได้รับข้อผิดพลาด: 'ความยาวของลำดับ rgba ควรเป็น 3 หรือ 4'
MattCochrane

1
@ MattClimbs ฉันสงสัยว่าคุณกำลังโทรหา plt.plot มากกว่า plt.scatter เหมือนในตัวอย่าง
smashbro

คุณจะเพิ่มแถบสีลงในพล็อตนี้ได้อย่างไร
FaCoffee

2
@FaCoffee plt.colorbar()จะทำเช่นนั้น
Mathew Savage

10

บางครั้งคุณอาจจะต้องมีสีที่พล็อตได้อย่างแม่นยำขึ้นอยู่กับกรณีที่ x-ค่า ตัวอย่างเช่นคุณอาจมี dataframe ที่มีตัวแปร 3 ประเภทและบางจุดข้อมูล และคุณต้องการที่จะทำตาม

  • พล็อตจุดที่สอดคล้องกับตัวแปรทางกายภาพ 'A' ในสีแดง
  • พล็อตจุดที่สอดคล้องกับตัวแปรทางกายภาพ 'B' ใน BLUE
  • พล็อตจุดที่สอดคล้องกับตัวแปรทางกายภาพ 'C' ใน GREEN

ในกรณีนี้คุณอาจต้องเขียนลงฟังก์ชั่นแบบสั้นเพื่อแมปค่า x กับชื่อสีที่เกี่ยวข้องเป็นรายการแล้วส่งผ่านรายการนั้นไปยังplt.scatterคำสั่ง

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

พล็อตการกระจายสีเป็นฟังก์ชันของตัวแปร x


จะสร้างแถบสีสำหรับพล็อตนี้ได้อย่างไร?
Maryam Rahmani Moghaddam
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.