簡體   English   中英

如何使用matplotlib創建具有連續軸的圖形?

[英]How do I create a graph that has a continuous axes with matplotlib?

我正在嘗試創建交互式圖形。 我無法弄清楚如何繪制一個連續的二次圖-就像在軸上縮小/移動一樣,方程式在那里繪制,而不僅僅是在2個點之間,所以它是連續的。

到目前為止,我已經知道了。

import matplotlib.pyplot as plt

xcoord=[]
ycoord=[]

for x in range(0,10):
    y=(2*x)**2 + 2*x + 4
    xcoord.append(x)
    ycoord.append(y)

plt.plot(xcoord,ycoord)
plt.show()

Matplotlib不是繪制函數,而是指向。 當然,如果連續函數僅足夠密集,則可以用點近似。

放大圖時確實會發生問題,在這種情況下,以前的密集點將散布開,並且可以觀察到多邊形結構。 相反,縮小時,可能未在特定范圍之外評估函數,因此該圖將大部分保持空白。

一種解決方案是在每次軸限制更改時評估功能,尤其是在覆蓋整個軸范圍並且具有與像素一樣多的點的網格上。 我們可以從圖形尺寸和dpi找出像素數。

為了顯示效果,我在這里添加了一個幅度較小的正弦函數。

import numpy as np
import matplotlib.pyplot as plt

func = lambda x: (2*x)**2 + 2*x + -4 + 0.2*np.sin(x*20)

fig, ax = plt.subplots()
ax.axis([-8,8,-100,400])
line, = ax.plot([])

def update(evt=None):
    xmin,xmax = ax.get_xlim()
    npoints = fig.get_size_inches()[0]*fig.dpi
    x = np.linspace(xmin, xmax, npoints)
    y = func(x)
    line.set_data(x,y)
    fig.canvas.draw_idle()

ax.callbacks.connect('xlim_changed', update)    
fig.canvas.mpl_connect("resize_event", update)
plt.show()

在此處輸入圖片說明

連續性很難復制,聽起來您需要的是增加繪圖密度。 更改循環並使用numpy

import numpy as np
numpy.linspace
import matplotlib.pyplot as plt

xcoord=[]
ycoord=[]

for x in np.linspace(0,10,1000):
    y=(2*x)**2 + 2*x + 4
    xcoord.append(x)
    ycoord.append(y)

plt.plot(xcoord,ycoord)
plt.show()

如果我理解您的問題,則希望基於當前軸的平移/縮放動態地重新計算繪圖的內容(坐標)。 這樣做需要使用事件處理來檢測軸極限的變化,然后使用這些極限之間的預定義數量的點重新計算坐標,最后相應地更新圖

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np


def my_func(x):
    return (2 * x) ** 2 + 2 * x + 4


def on_lims_change(axes):
    xmin, xmax = axes.get_xlim()
    new_x = np.linspace(xmin, xmax, 1000)
    new_y = my_func(new_x)
    l.set_data(new_x, new_y)


fig, ax = plt.subplots()
xcoord = np.linspace(0, 10, 1000)
ycoord = my_func(xcoord)
l, = ax.plot(xcoord, ycoord, 'r-')

ax.callbacks.connect('xlim_changed', on_lims_change)
ax.callbacks.connect('ylim_changed', on_lims_change)

on_lims_change(ax)
plt.show()

致謝@ImportanceOfBeingErnest,以顯示如何在此答案中更改軸限制時連接事件處理程序

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM