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.

Saya menjadi
sumber

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!

chill_turner
sumber
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
466

Anda sedang mencari axhline(garis sumbu horizontal). Misalnya, berikut ini akan memberi Anda garis horizontal di y = 0.5:

import matplotlib.pyplot as plt
plt.axhline(y=0.5, color='r', linestyle='-')
plt.show()

angka sampel

BlivetWidget
sumber
15
Docs: axhline.
menangani
1
Tautan dokumen di atas tidak berfungsi - tautan yang diperbaiki di sini: matplotlib.org/api/_as_gen/matplotlib.pyplot.axhline.html
Ender2050
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

jdhao
sumber
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

Trenton McKinney
sumber
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

ayorgo
sumber
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.

LSchueler
sumber
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

Mehdi
sumber