Làm thế nào để thực hiện một âm mưu phân tán với các vòng tròn trống trong Python?


166

Trong Python, với Matplotlib, làm thế nào một âm mưu phân tán với các vòng tròn trống có thể được vẽ? Mục đích là để vẽ các vòng tròn trống xung quanh một số đĩa màu đã được vẽ scatter(), để làm nổi bật chúng, lý tưởng mà không phải vẽ lại các vòng tròn màu.

Tôi đã cố gắng facecolors=None, vô ích.


1
Những người tìm cách vẽ các ô phân tán rỗng / rỗng với các màu khác nhau có thể nhìn vào câu hỏi này .
ImportanceOfByingErnest

Câu trả lời:


242

Từ các tài liệu cho phân tán:

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

Hãy thử như sau:

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

hình ảnh ví dụ

Lưu ý: Đối với các loại lô khác, xem bài đăng này về việc sử dụng markeredgecolormarkerfacecolor.


4
Cảm ơn! Gotcha là thông thường hơn (trong Python) facecolors=Nonekhông hoạt động, điều đó làm tôi vấp ngã.
Eric O Lebigot

24
Rất hữu ích. Đó là markerfacecolor='none', đây là cách của nó bây giờ.
hesham_EE

2
Tôi đã có phong cách matplotlib của mình theo cách đặt chiều rộng các cạnh bằng không. Nếu bạn không thấy bất kỳ điểm đánh dấu nào bằng markerfacecolor='none'cách thử thêmmarkeredgewidth=1.0
oLas

Cách tiếp cận này cũng có thể được sử dụng trong sanh ở biển sau khi làm việc nhập khẩu tiêu chuẩn của Matplotlib %matplotlib inlineimport matplotlib.pyplot as plt, và sau đó thiết lập sanh ở biển trở thành mặc định âm mưu bởiimport seaborn as sns; sns.set()
Jakob

68

Những cái này sẽ làm việc?

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

hình ảnh ví dụ

hoặc sử dụng cốt truyện ()

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

hình ảnh ví dụ


3
Điều này hữu ích khi bạn sử dụng plotthay vìscatter
Trevor Boyd Smith

2
Đối với scatter, bạn cần xác định edgecolorsnhư thế nào edgecolors='r'. Nếu không, các vòng tròn biến mất. Xem tại đây
T_T

14

Đây là một cách khác: điều này thêm một vòng tròn vào các trục, cốt truyện hoặc hình ảnh hiện tại hoặc bất cứ điều gì:

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 )

văn bản thay thế

(Các vòng tròn trong hình bị đè bẹp thành hình elip vì imshow aspect="auto").


5

Trong matplotlib 2.0, có một tham số được gọi là fillstyle cho phép kiểm soát tốt hơn cách điền các điểm đánh dấu. Trong trường hợp của tôi, tôi đã sử dụng nó với errorbars nhưng nó hoạt động cho các điểm đánh dấu nói chung http://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.errorbar.html

fillstylechấp nhận các giá trị sau: ['đầy đủ' | 'trái' | 'đúng' | 'dưới cùng' | 'hàng đầu' | 'không ai']

Có hai điều quan trọng cần lưu ý khi sử dụng fillstyle,

1) Nếu mfc được đặt thành bất kỳ loại giá trị nào, nó sẽ được ưu tiên, do đó, nếu bạn đã đặt fillstyle thành 'none' thì nó sẽ không có hiệu lực. Vì vậy, tránh sử dụng mfc kết hợp với fillstyle

2) Bạn có thể muốn kiểm soát độ rộng cạnh của điểm đánh dấu (sử dụng markeredgewidthhoặc mew) bởi vì nếu điểm đánh dấu tương đối nhỏ và chiều rộng cạnh dày, các điểm đánh dấu sẽ trông giống như được lấp đầy mặc dù chúng không.

Sau đây là một ví dụ sử dụng lỗi:

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

2

Dựa vào ví dụ của Gary Kerr và như được đề xuất ở đây, người ta có thể tạo các vòng tròn trống liên quan đến các giá trị được chỉ định với mã sau:

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

Đây thực chất là một phiên bản phức tạp, câu trả lời được chấp nhận
Eric O Lebigot

Từ quan điểm của tôi là nó không. Sử dụng biểu đồ phân tán với màu sắc không ngoại trừ facecolor = "none" trong lệnh. Do đó, việc loại bỏ facecolor sau đó là cần thiết như được mô tả trong liên kết đã cho. Không may giải pháp phức tạp này là cần thiết để loại bỏ facecolor trong các ô phân tán với mã màu.
Aroc

Cách tiếp cận trong câu trả lời này thực sự hữu ích nếu một người muốn cập nhật biểu đồ ban đầu không chứa các vòng tròn trống. Tuy nhiên, câu hỏi về việc tạo trực tiếp các vòng tròn này, vì vậy giải pháp được chấp nhận là cách thực hiện, vì nó thực hiện giống như câu trả lời này nhưng trực tiếp, không có cập nhật ngoại lai của biểu đồ đầu tiên.
Eric O Lebigot

"Phiên bản phức tạp" này hoạt động với tôi khi nhúng đối số trong .scatter()không. Đối với bối cảnh, tôi cũng đang áp dụng một bản đồ màu ( c=z, cmap='jet').
Andrew Silver

1

Vì vậy, tôi giả sử bạn muốn làm nổi bật một số điểm phù hợp với một tiêu chí nhất định. Bạn có thể sử dụng lệnh của Prelude để thực hiện một biểu đồ phân tán thứ hai của các điểm sáng với một vòng tròn trống và một cuộc gọi đầu tiên để vẽ tất cả các điểm. Hãy chắc chắn rằng tham số s đủ nhỏ để các vòng tròn trống lớn hơn bao quanh các vòng tròn nhỏ hơn.

Tùy chọn khác là không sử dụng phân tán và vẽ các bản vá riêng lẻ bằng cách sử dụng lệnh hình tròn / hình elip. Đây là trong matplotlib.patches, đây là một số mã mẫu về cách vẽ hình chữ nhật hình tròn, v.v.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.