Đặt điểm đánh dấu cho các điểm riêng lẻ trên một dòng trong Matplotlib


174

Tôi đã sử dụng Matplotlib để vẽ các đường thẳng trên một hình. Bây giờ tôi muốn đặt kiểu, cụ thể là điểm đánh dấu, cho các điểm riêng lẻ trên dòng. Làm thế nào để tôi làm điều này?

Để làm rõ câu hỏi của tôi, tôi muốn có thể đặt kiểu cho các điểm đánh dấu riêng lẻ trên một dòng, không phải mọi điểm đánh dấu trên dòng đã nói.


2
Giải pháp liên quan cho khoảng cách đánh dấu arclength: stackoverflow.com/questions/17406758/ory
Ioannis Filippidis

Câu trả lời:


323

Chỉ định từ khóa args linestylevà / hoặc markertrong cuộc gọi của bạn tới plot.

Ví dụ: sử dụng đường đứt nét và đánh dấu vòng tròn màu xanh:

plt.plot(range(10), linestyle='--', marker='o', color='b')

Một cuộc gọi tắt cho cùng một điều:

plt.plot(range(10), '--bo')

ví dụ 1

Dưới đây là danh sách các kiểu đường kẻ và điểm đánh dấu có thể:

================    ===============================
character           description
================    ===============================
   -                solid line style
   --               dashed line style
   -.               dash-dot line style
   :                dotted line style
   .                point marker
   ,                pixel marker
   o                circle marker
   v                triangle_down marker
   ^                triangle_up marker
   <                triangle_left marker
   >                triangle_right marker
   1                tri_down marker
   2                tri_up marker
   3                tri_left marker
   4                tri_right marker
   s                square marker
   p                pentagon marker
   *                star marker
   h                hexagon1 marker
   H                hexagon2 marker
   +                plus marker
   x                x marker
   D                diamond marker
   d                thin_diamond marker
   |                vline marker
   _                hline marker
================    ===============================

chỉnh sửa: với một ví dụ về việc đánh dấu một tập hợp con các điểm tùy ý, như được yêu cầu trong các bình luận:

import numpy as np
import matplotlib.pyplot as plt

xs = np.linspace(-np.pi, np.pi, 30)
ys = np.sin(xs)
markers_on = [12, 17, 18, 19]
plt.plot(xs, ys, '-gD', markevery=markers_on)
plt.show()

ví dụ2

Ví dụ cuối cùng sử dụng markeverykwarg này có thể có từ 1.4+, do sự hợp nhất của nhánh tính năng này . Nếu bạn bị mắc kẹt trên một phiên bản cũ hơn của matplotlib, bạn vẫn có thể đạt được kết quả bằng cách phủ lên một biểu đồ phân tán trên biểu đồ đường. Xem lịch sử chỉnh sửa để biết thêm chi tiết.


2
Tôi biết phần đó. Những gì tôi muốn làm là chỉ đánh dấu một số điểm nhất định. Lấy ví dụ của bạn, làm thế nào tôi chỉ đặt một điểm đánh dấu vào điểm 2 và 3? Xin lỗi nếu câu hỏi của tôi không đủ rõ ràng về khía cạnh này.
dbmikus

4
Bạn có thể gọi cốt truyện một lần với kiểu '-', và sau đó bạn có thể gọi lại âm mưu, trên một tập hợp con các điểm, với kiểu 'o'.
wim

Tôi sẽ chỉ lặp đi lặp lại các giá trị tôi đã cung cấp cho âm mưu và chỉ tạo một biểu đồ con chấm bị ngắt kết nối với các điểm đánh dấu? Và sau đó họ sẽ được đặt lên hàng đầu của dòng trước? Hoặc có một cách sạch hơn để làm điều đó? Tôi ổn khi làm theo cách đó, nhưng tôi muốn viết mã theo cách dễ chấp nhận nhất.
dbmikus

1
Không, không sử dụng vòng lặp, sẽ có quá nhiều nghệ sĩ trên khung vẽ có thể rất chậm. Sử dụng một lát của đầu vào ban đầu.
wim

@AbidRahmanK Bạn cũng có thể xem tất cả các điểm đánh dấu có sẵn thông qua matplotlib.markers.MarkerStyle.markers, trả về một từ điển tương tự như những gì wim đã đăng ở trên.
joelostblom

53

Có một hình ảnh hiển thị tất cả tên và mô tả đánh dấu, tôi hy vọng nó sẽ giúp bạn.

import matplotlib.pylab as plt
markers=['.',',','o','v','^','<','>','1','2','3','4','8','s','p','P','*','h','H','+','x','X','D','d','|','_']
descriptions=['point', 'pixel', 'circle', 'triangle_down', 'triangle_up','triangle_left', 'triangle_right', 'tri_down', 'tri_up', 'tri_left','tri_right', 'octagon', 'square', 'pentagon', 'plus (filled)','star', 'hexagon1', 'hexagon2', 'plus', 'x', 'x (filled)','diamond', 'thin_diamond', 'vline', 'hline']
x=[]
y=[]
for i in range(5):
    for j in range(5):
        x.append(i)
        y.append(j)
plt.figure()
for i,j,m,l in zip(x,y,markers,descriptions):
    plt.scatter(i,j,marker=m)
    plt.text(i-0.15,j+0.15,s=m+' : '+l)
plt.axis([-0.1,4.8,-0.1,4.5])
plt.tight_layout()
plt.axis('off')
plt.show()  

ví dụ 1


14

Để tham khảo trong tương lai - Line2Dnghệ sĩ được trả về plot()cũng có một set_markevery()phương thức cho phép bạn chỉ đặt điểm đánh dấu vào một số điểm nhất định - xem https://matplotlib.org/api/_as_gen/matplotlib.lines.Line2D.html#matplotlib.lines.Line2D. set_markevery


2
Đúng, nhưng không phải trên các điểm tùy ý - nó phải được bắt đầu: stop: bước sắp xếp các tập hợp con tôi nghĩ ..
wim

Ấn tượng của tôi là cả hai bài viết trên đều trả lời câu hỏi. Lý do là họ giải quyết hai vấn đề khác nhau. Thuật ngữ "đánh dấu" thường dùng để chỉ phong cách của một đường cong. Vì vậy, một quy tắc thông thường (ví dụ cứ 10) được ngụ ý. Nếu bạn muốn chọn ra một số tập hợp con "tùy ý", vui lòng xem đó là một đường cong riêng biệt, không phải là điểm đánh dấu trên đường cong ban đầu. Nó chỉ là một đường cong khác nhau có dấu hiệu. Vì vậy, bạn sẽ phải tự chọn các điểm. Chủ đề này là thú vị và đi sâu hơn, sẽ bình luận nhiều hơn trong một bài viết trong tương lai, sau khi phát hành mã có liên quan.
Ioannis Filippidis

1
@wim Có một PR hy vọng sẽ biến nó thành 1.4 cho phép bạn đánh dấu các điểm tùy ý github.com/matplotlib/matplotlib/pull/2662
tacaswell

1

Một mẹo đơn giản để thay đổi hình dạng, kích thước điểm đánh dấu cụ thể ... trước tiên là vẽ nó với tất cả các dữ liệu khác, sau đó vẽ thêm một ô nữa với điểm đó (hoặc tập hợp các điểm nếu bạn muốn thay đổi kiểu nhiều điểm) . Giả sử chúng ta muốn thay đổi hình dạng đánh dấu của điểm thứ hai:

x = [1,2,3,4,5]
y = [2,1,3,6,7]

plt.plot(x, y, "-o")
x0 = [2]
y0 = [1]
plt.plot(x0, y0, "s")

plt.show()

Kết quả là: Lô có nhiều điểm đánh dấu

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.