Matplotlib kullanarak yatay bir çizgi çizin


131

Bir zaman serisini yumuşatmak için spline enterpolasyonunu kullandım ve ayrıca grafiğe yatay bir çizgi eklemek istiyorum. Ama elimde olmayan bir sorun var gibi görünüyor. Herhangi bir yardım gerçekten yardımcı olacaktır. İşte sahip olduğum şey:

annual = np.arange(1,21,1)
l = np.array(value_list) # a list with 20 values
spl = UnivariateSpline(annual,l)
xs = np.linspace(1,21,200)
plt.plot(xs,spl(xs),'b')

plt.plot([0,len(xs)],[40,40],'r--',lw=2)
pylab.ylim([0,200])
plt.show()

problem, benim [0,len(xs)]yatay çizgi çizimi için kullanmamla ilgili görünüyor .

Yanıtlar:


5

Haklısın, bence [0,len(xs)]seni başından savıyor. Orijinal x ekseni değişkenini yeniden kullanmak ve xsbunu, içinde değişkeninizin bulunduğu aynı uzunlukta başka bir uyuşmuş dizi ile çizmek isteyeceksiniz .

annual = np.arange(1,21,1)
l = np.array(value_list) # a list with 20 values
spl = UnivariateSpline(annual,l)
xs = np.linspace(1,21,200)
plt.plot(xs,spl(xs),'b')

#####horizontal line
horiz_line_data = np.array([40 for i in xrange(len(xs))])
plt.plot(xs, horiz_line_data, 'r--') 
###########plt.plot([0,len(xs)],[40,40],'r--',lw=2)
pylab.ylim([0,200])
plt.show()

Umarım bu sorunu çözer!


19
Bu işe yarar, ancak özellikle verilere bağlı olarak potansiyel olarak çok büyük bir dizi oluşturduğunuz için özellikle verimli değildir. Bunu bu şekilde yapacaksanız, biri başında biri sonunda olmak üzere iki veri noktasına sahip olmak daha akıllıca olacaktır. Yine de, matplotlib zaten yatay çizgiler için özel bir işleve sahiptir.
BlivetWidget


31

Eksenlerde yatay bir çizgi çizmek istiyorsanız ax.hlines()yöntemi de deneyebilirsiniz . Belirtmek gerekir ykonumu ve xminve xmaxverilerindeki (gerçek veri x ekseni arasında değişen, yani) koordinat. Örnek bir kod parçacığı:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(1, 21, 200)
y = np.exp(-x)

fig, ax = plt.subplots()
ax.plot(x, y)
ax.hlines(y=0.2, xmin=4, xmax=20, linewidth=2, color='r')

plt.show()

Yukarıdaki pasaj, eksenlerinde yatay bir çizgi çizecektir y=0.2. Yatay çizgi başlangıcı x=4ve bitişi x=20. Oluşturulan görüntü:

görüntü açıklamasını buraya girin


bu, axhlineçizmeyi düşündüğünüz çizginin belirli bir x aralığına ihtiyacınız olduğunda çok daha kullanışlıdır . 'Axhline' ve 'hlines' arasındaki fark nedir?
Jason Goal

İçinde axhline, xminve xmaxeksenleri cinsinden koordinatları [0, 1] aralığında olurlar. Farklı koordinat sistemleri arasındaki farkı burada görebilirsiniz .
jdhao

Bu takdirde sayesinde xminve xmaxfark arasındaki tek fark axhlineve hlineseski ikincisi ağırlıkta olmak değil mi?
Jason Goal

15

Kullanım matplotlib.pyplot.hlines:

  • Bir ileterek birden yatay çizgiler çizmek Can listiçin yparametre.
  • y tek bir konum olarak geçilebilir: y=40
  • y birden çok konum olarak geçilebilir: y=[39, 40, 41]
  • Bir böyle bir şey ile bir rakam komplo ediyorsanız fig, ax = plt.subplots(), o zaman değiştirin plt.hlinesveya plt.axhlinebirlikte ax.hlinesveya ax.axhlinesırasıyla.
  • matplotlib.pyplot.axhlineyalnızca tek bir konumu çizebilir (örneğin y=40)

plt.plot

import numpy as np
import matplotlib.pyplot as plt

plt.figure(figsize=(6, 3))
plt.hlines(y=39.5, xmin=0, xmax=len(xs), colors='aqua', linestyles='--', lw=2, label='Single Line')
plt.hlines(y=[39, 40, 41], xmin=0, xmax=len(xs), colors='purple', linestyles='--', lw=2, label='Multiple Lines')
plt.legend(bbox_to_anchor=(1.04,0.5), loc="center left", borderaxespad=0)

görüntü açıklamasını buraya girin

ax.plot

import numpy as np
import matplotlib.pyplot as plt

xs = np.linspace(1, 21, 200)
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(6, 6))

ax1.hlines(y=40, xmin=0, xmax=len(xs), colors='r', linestyles='--', lw=2)
ax1.set_title('One Line')

ax2.hlines(y=[39, 40, 41], xmin=0, xmax=len(xs), colors='purple', linestyles='--', lw=2)
ax2.set_title('Multiple Lines')

plt.show()

görüntü açıklamasını buraya girin


12

Burada en çok oylanan cevaba ek olarak, a 'lar axhlineçağrıldıktan sonra da zincirleme yapılabilir .plotpandasDataFrame

import pandas as pd

(pd.DataFrame([1, 2, 3])
   .plot(kind='bar', color='orange')
   .axhline(y=1.5));

görüntü açıklamasını buraya girin


2

Her zaman emri unutanlar için güzel ve kolay bir yol axhlineşudur:

plt.plot(x, [y]*len(x))

Sizin durumunuzda xs = xve y = 40. Eğer len (x) büyükse, bu verimsiz hale gelir ve gerçekten kullanmalısınız axhline.


2

plt.gridYatay bir çizgi çizmek için kullanabilirsiniz .

import numpy as np
from matplotlib import pyplot as plt
from scipy.interpolate import UnivariateSpline
from matplotlib.ticker import LinearLocator

# your data here
annual = np.arange(1,21,1)
l = np.random.random(20)
spl = UnivariateSpline(annual,l)
xs = np.linspace(1,21,200)

# plot your data
plt.plot(xs,spl(xs),'b')

# horizental line?
ax = plt.axes()
# three ticks:
ax.yaxis.set_major_locator(LinearLocator(3))
# plot grids only on y axis on major locations
plt.grid(True, which='major', axis='y')

# show
plt.show()

rastgele veri arsa örneği

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.