Matplotlib'de bir satırdaki tek tek noktalar için işaretler ayarlama


174

Bir şekil üzerinde çizgiler çizmek için Matplotlib kullandım. Şimdi çizgiyi tek tek noktalar için stilini, özellikle işaretleyiciyi ayarlamak istiyorum. Bunu nasıl yaparım?

Sorumu açıklığa kavuşturmak için, söz konusu satırdaki her bir işaretleyiciyi değil, bir satırdaki tek tek işaretleyicilerin stilini ayarlamak istiyorum.


2
Arclength işaretleyici aralığı için ilgili çözüm: stackoverflow.com/questions/17406758/…
Ioannis Filippidis

Yanıtlar:


324

Anahtar kelime değişkenlerini linestyleve / veya markerçağrınızda belirtin plot.

Örneğin, kesikli çizgi ve mavi daire işaretleri kullanarak:

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

Aynı şey için bir kısayol çağrısı:

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

örnek 1

Olası çizgi ve işaretçi stillerinin listesi:

================    ===============================
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
================    ===============================

edit: yorumlarda istendiği gibi rastgele bir nokta alt kümesi işaretleme örneği:

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

example2

markeveryKwarg kullanan bu son örnek , bu özellik dalının birleşmesi nedeniyle 1.4+'den beri mümkündür . Matplotlib'in daha eski bir sürümüne takılı kalırsanız, yine de çizgi grafiğine bir dağılım grafiğini bindirerek sonucu elde edebilirsiniz. Daha fazla ayrıntı için düzenleme geçmişine bakın.


2
O kısmı biliyorum. Yapmak istediğim sadece belirli noktaları işaretlemek. Örneğiniz göz önüne alındığında, örneğin yalnızca 2. ve 3. noktalara nasıl işaret koyabilirim? Sorum bu konuda yeterince açık değilse özür dilerim.
dbmikus

4
'-' stilini kullanarak bir kez arsa çağırabilir ve daha sonra noktaların bir alt kümesinde 'o' stilini kullanarak arsa tekrar çağırabilirsiniz.
wim

Sadece çizmek için sağladığım değerler üzerinde yineleme ve sadece işaretçileri olan bir bağlantısı kesilmiş nokta alt grafiği yapmak? Ve sonra bir önceki çizginin üzerine yerleştirileceklerdi? Yoksa bunu yapmanın daha temiz bir yolu var mı? Bunu bu şekilde yapıyorum, ama en kabul edilebilir şekilde kodlamak istiyorum.
dbmikus

1
Hayır, bir döngü kullanmayın, bu tuval üzerinde gerçekten çok yavaş olabilecek çok fazla sanatçı olacak. Orijinal girişin bir dilimini kullanın.
wim

@AbidRahmanK Ayrıca, yukarıdaki wim'e matplotlib.markers.MarkerStyle.markersbenzer bir sözlük döndüren mevcut tüm işaretçileri de görüntüleyebilirsiniz .
joelostblom

55

Tüm işaretçilerin adını ve açıklamasını gösteren bir resim var, umarım size yardımcı olacaktır.

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

örnek 1


14

İleride başvurmak için - Line2Dgeri dönen sanatçının yalnızca belirli noktalara işaretler koymanıza izin veren plot()bir set_markevery()yöntemi vardır - bkz. Https://matplotlib.org/api/_as_gen/matplotlib.lines.Line2D.html#matplotlib.lines.Line2D. set_markevery


2
Doğru, ama keyfi noktalarda değil - başlaması gerekiyor: dur: sanırım alt tür adım adım ..
wim

Benim izlenimim yukarıdaki mesajların her ikisinin de soruyu cevapladığı. Bunun nedeni iki farklı konuyu ele almalarıdır. "İşaretleyiciler" terimi genellikle bir eğrinin stilini belirtir. Dolayısıyla, düzenli bir kural (örneğin her 10'da) ima edilir. Bazı "keyfi" nokta alt kümelerini ayırmak isterseniz, lütfen bunu orijinal eğri üzerinde işaretler olarak değil ayrı bir eğri olarak düşünün. Bu sadece belirteçleri olan farklı bir eğri. Bu yüzden noktaları manuel olarak seçmeniz beklenir. Bu konu ilginç ve derinleşiyor, ilgili kodu yayınladıktan sonra gelecekteki bir gönderide daha fazla yorum yapacak.
Ioannis Filippidis

1
@wim Umarım keyfi puanları işaretlemenize izin veren 1.4 olarak bir PR vardır github.com/matplotlib/matplotlib/pull/2662
tacaswell

1

Belirli bir nokta işaretçisi şeklini, boyutunu değiştirmek için basit bir hile önce diğer tüm verilerle çizmek, daha sonra sadece bu nokta ile (veya birden fazla noktanın stilini değiştirmek istiyorsanız nokta kümesi) bir grafik çizmektir. . İkinci noktanın işaretleyici şeklini değiştirmek istediğimizi varsayalım:

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

Sonuç: Çoklu işaretleyicili çizim

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.