วิธีการทำพล็อตกระจายกับวงกลมที่ว่างใน Python


167

ใน Python ด้วย Matplotlib พล็อตกระจายที่มีวงกลมว่างเปล่าจะถูกพล็อตได้อย่างไร เป้าหมายคือการวาดวงกลมที่ว่างเปล่ารอบ ๆดิสก์สีบางอันที่ได้วางแผนไว้แล้วscatter()เพื่อที่จะไฮไลต์โดยไม่ต้องวาดวงกลมสีใหม่

ฉันพยายามที่facecolors=Noneจะไม่มีประโยชน์


1
ผู้ที่ต้องการวาดแผนการกระจายที่ว่าง / กลวงที่มีสีต่างกันอาจดูคำถามนี้
ImportanceOfBeingErnest

คำตอบ:


243

จากเอกสารสำหรับการกระจาย:

Optional kwargs control the Collection properties; in particular:

    edgecolors:
        The string none to plot faces with no outlines
    facecolors:
        The string none to plot unfilled outlines

ลองทำสิ่งต่อไปนี้:

import matplotlib.pyplot as plt 
import numpy as np 

x = np.random.randn(60) 
y = np.random.randn(60)

plt.scatter(x, y, s=80, facecolors='none', edgecolors='r')
plt.show()

ภาพตัวอย่าง

หมายเหตุ:สำหรับประเภทอื่น ๆ ของแปลงดูโพสต์นี้เกี่ยวกับการใช้และmarkeredgecolormarkerfacecolor


4
ขอบคุณ! gotcha ก็คือยิ่งปกติ (ใน Python) facecolors=Noneไม่ทำงานซึ่งทำให้ฉันสะดุด
Eric O Lebigot

24
มีประโยชน์มาก มันmarkerfacecolor='none'นี้เป็นวิธีที่มันเป็นตอนนี้
hesham_EE

2
ฉันมีสไตล์ matplotlib ในแบบที่กำหนดความกว้างของขอบให้เป็นศูนย์ หากคุณไม่เห็นเครื่องหมายใด ๆmarkerfacecolor='none'ลองเพิ่มmarkeredgewidth=1.0
oLas

วิธีนี้ยังสามารถนำมาใช้ในทะเลหลังจากทำการนำเข้ามาตรฐานของ Matplotlib %matplotlib inlineและimport matplotlib.pyplot as pltแล้วการตั้งค่าทะเลที่จะเริ่มต้นการวางแผนโดยimport seaborn as sns; sns.set()
จาคอบ

68

จะใช้งานได้ไหม

plt.scatter(np.random.randn(100), np.random.randn(100), facecolors='none')

ภาพตัวอย่าง

หรือใช้พล็อต ()

plt.plot(np.random.randn(100), np.random.randn(100), 'o', mfc='none')

ภาพตัวอย่าง


3
สิ่งนี้มีประโยชน์เมื่อคุณใช้plotแทนscatter
Trevor Boyd Smith

2
สำหรับscatterคุณจำเป็นต้องระบุเช่นedgecolors edgecolors='r'มิฉะนั้นวงกลมจะหายไป ดูที่นี่
T_T

14

นี่เป็นอีกวิธีหนึ่ง: เป็นการเพิ่มวงกลมให้กับแกนปัจจุบันพล็อตหรือรูปภาพหรืออะไรก็ตาม:

from matplotlib.patches import Circle  # $matplotlib/patches.py

def circle( xy, radius, color="lightsteelblue", facecolor="none", alpha=1, ax=None ):
    """ add a circle to ax= or current axes
    """
        # from .../pylab_examples/ellipse_demo.py
    e = Circle( xy=xy, radius=radius )
    if ax is None:
        ax = pl.gca()  # ax = subplot( 1,1,1 )
    ax.add_artist(e)
    e.set_clip_box(ax.bbox)
    e.set_edgecolor( color )
    e.set_facecolor( facecolor )  # "none" not None
    e.set_alpha( alpha )

ข้อความแสดงแทน

(วงกลมในภาพถูกบีบให้เป็นวงรีเนื่องจากimshow aspect="auto")


5

ใน matplotlib 2.0 มีพารามิเตอร์ที่เรียกว่าfillstyle ซึ่งช่วยให้การควบคุมที่ดีขึ้นเกี่ยวกับวิธีการเติมเครื่องหมาย ในกรณีของฉันฉันใช้กับ errorbars แต่มันใช้งานได้กับเครื่องหมายโดยทั่วไป http://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.errorbar.html

fillstyleยอมรับค่าต่อไปนี้: ['เต็ม' | 'ซ้าย' | 'ขวา' | 'ด้านล่าง' | 'ด้านบน' | 'ไม่มี']

สิ่งสำคัญสองประการที่ควรคำนึงถึงเมื่อใช้งานfillstyleคือ

1) หาก mfc ถูกตั้งค่าเป็นค่าใด ๆ มันจะให้ความสำคัญดังนั้นถ้าคุณตั้งค่ารูปแบบเป็น 'ไม่มี' มันจะไม่มีผล ดังนั้นหลีกเลี่ยงการใช้ mfc ร่วมกับ fillstyle

2) คุณอาจต้องการควบคุมความกว้างของขอบเครื่องหมาย (โดยใช้markeredgewidthหรือmew) เพราะถ้าเครื่องหมายมีขนาดค่อนข้างเล็กและความกว้างของขอบมีความหนาเครื่องหมายจะมีลักษณะเหมือนเติมแม้ว่าจะไม่ได้

ต่อไปนี้เป็นตัวอย่างการใช้ errorbars:

myplot.errorbar(x=myXval, y=myYval, yerr=myYerrVal, fmt='o', fillstyle='none', ecolor='blue',  mec='blue')

2

อ้างอิงจากตัวอย่างของ Gary Kerr และตามที่เสนอไว้ที่นี่หนึ่งอาจสร้างวงกลมว่างเปล่าที่เกี่ยวข้องกับค่าที่ระบุด้วยรหัสต่อไปนี้:

import matplotlib.pyplot as plt 
import numpy as np 
from matplotlib.markers import MarkerStyle

x = np.random.randn(60) 
y = np.random.randn(60)
z = np.random.randn(60)

g=plt.scatter(x, y, s=80, c=z)
g.set_facecolor('none')
plt.colorbar()
plt.show()

นี่เป็นรุ่นที่ซับซ้อนซึ่งเป็นคำตอบที่ได้รับการยอมรับ ...
Eric O Lebigot

จากจุดของฉันมันไม่ได้ การใช้พล็อตกระจายที่มีสีไม่ได้ยกเว้น facecolor = "none" ภายในคำสั่ง ดังนั้นจำเป็นต้องทำการลบสีใบหน้าตามที่อธิบายในลิงค์ที่ให้ไว้ น่าเสียดายที่วิธีการแก้ปัญหาที่ซับซ้อนนี้เป็นสิ่งจำเป็นในการลบสีใบหน้าในแผนการกระจายด้วยการเข้ารหัสสี
Aroc

แนวทางในคำตอบนี้มีประโยชน์จริง ๆ หากใครต้องการอัปเดตกราฟที่ แต่เดิมไม่มีวงกลมว่างเปล่า อย่างไรก็ตามคำถามเกี่ยวกับการสร้างแวดวงเหล่านี้โดยตรงดังนั้นวิธีการแก้ปัญหาที่ยอมรับจึงเป็นไปเช่นเดียวกับคำตอบนี้ แต่โดยตรงโดยไม่มีการอัปเดตภายนอกของกราฟแรก
Eric O Lebigot

นี้ "รุ่น complexified" ทำงานให้ฉันเมื่อฝังโต้แย้งภายใน.scatter()ไม่ได้ สำหรับบริบทฉันยังใช้ colormap ( c=z, cmap='jet')
Andrew Silver

1

ดังนั้นฉันคิดว่าคุณต้องการเน้นบางจุดที่ตรงกับเกณฑ์ที่กำหนด คุณสามารถใช้คำสั่งของ Prelude เพื่อทำพล็อตกระจายที่สองของคะแนนไฮไลต์ที่มีวงกลมว่างเปล่าและการโทรครั้งแรกเพื่อพล็อตจุดทั้งหมด ตรวจสอบให้แน่ใจว่าพารามิเตอร์มีขนาดเล็กเพียงพอสำหรับวงกลมว่างที่ใหญ่กว่าเพื่อใส่วงกลมที่เล็กกว่าไว้

ตัวเลือกอื่นคือไม่ใช้การกระจายและวาดการปะแยกแต่ละรายการโดยใช้คำสั่ง circle / ellipse เหล่านี้อยู่ใน matplotlib.patchesนี่คือตัวอย่างรหัสบางส่วนเกี่ยวกับวิธีการวาดรูปสี่เหลี่ยมผืนผ้าวงกลม ฯลฯ

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