Plot garis horizontal menggunakan matplotlib


131

Saya telah menggunakan interpolasi spline untuk memperlancar deret waktu dan juga ingin menambahkan garis horizontal ke plot. Tapi sepertinya ada masalah yang ada di luar jangkauan saya. Setiap bantuan akan sangat membantu. Inilah yang saya miliki:

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

Masalahnya tampaknya dengan penggunaan saya [0,len(xs)]untuk merencanakan garis horizontal.

Jawaban:


5

Anda benar, saya pikir [0,len(xs)]itu membuat Anda marah. Anda akan ingin menggunakan kembali variabel sumbu x asli xsdan memplotnya dengan array numpy lain dengan panjang yang sama yang memiliki variabel Anda di dalamnya.

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

Semoga itu memperbaiki masalah!


19
Ini berfungsi, tetapi itu tidak terlalu efisien, terutama karena Anda membuat array yang berpotensi sangat besar tergantung pada data. Jika Anda akan melakukannya dengan cara ini, akan lebih pintar untuk memiliki dua titik data, satu di awal dan satu di akhir. Namun, matplotlib sudah memiliki fungsi khusus untuk garis horizontal.
BlivetWidget


31

Jika Anda ingin menggambar garis horizontal pada sumbu, Anda juga dapat mencoba ax.hlines()metode. Anda perlu menentukan yposisi dan xmindan xmaxdalam koordinat data (yaitu, kisaran data aktual Anda di sumbu x). Cuplikan kode contoh adalah:

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

Cuplikan di atas akan memplot garis horizontal pada sumbu di y=0.2. Garis horizontal dimulai pada x=4dan berakhir pada x=20. Gambar yang dihasilkan adalah:

masukkan deskripsi gambar di sini


ini jauh lebih nyaman daripada axhlineketika Anda membutuhkan rentang x spesifik dari garis yang ingin Anda gambar. Apa perbedaan antara 'axhline' dan 'hlines'?
Jason Goal

Dalam axhline, xmindan xmaxdalam hal sumbu berkoordinasi sehingga mereka berada dalam kisaran [0, 1]. Anda dapat melihat di sini untuk perbedaan antara sistem koordinat yang berbeda.
jdhao

Terima kasih, jika ini xmindan xmaxperbedaan adalah satu-satunya perbedaan antara axhlinedan hlines, bukankah yang terakhir mendominasi yang pertama?
Jason Goal

15

Gunakan matplotlib.pyplot.hlines:

  • y dapat dilewatkan sebagai satu lokasi: y=40
  • y dapat dilewati sebagai beberapa lokasi: y=[39, 40, 41]
  • Jika Anda merencanakan gambar dengan sesuatu seperti fig, ax = plt.subplots(), maka ganti plt.hlinesatau plt.axhlinedengan ax.hlinesatau ax.axhline, masing-masing.
  • matplotlib.pyplot.axhlinehanya dapat memplot satu lokasi (mis. y=40)
import numpy as np
import matplotlib.pyplot as plt

xs = np.linspace(1, 21, 200)
plt.hlines(y=40, xmin=0, xmax=len(xs), colors='r', linestyles='--', lw=2)
plt.show()

masukkan deskripsi gambar di sini


12

Selain jawaban yang paling upvoted di sini, satu juga dapat rantai axhlinesetelah menelepon plotpada pandas's DataFrame.

import pandas as pd

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

masukkan deskripsi gambar di sini


2

Cara yang baik dan mudah bagi orang-orang yang selalu lupa perintah axhlineadalah sebagai berikut

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

Dalam kasus Anda xs = xdan y = 40. Jika len (x) besar, maka ini menjadi tidak efisien dan Anda harus benar-benar menggunakannya axhline.


2

Anda dapat menggunakan plt.griduntuk menggambar garis horizontal.

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

contoh plot data acak

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.