如何使用matplotlib创建具有连续轴的图形?

时间:2018-07-31 18:58:25

标签: python python-3.x matplotlib plot graph

我正在尝试创建一个交互式图形。我无法弄清楚如何绘制一个连续的二次图-就像在轴上缩小/移动一样,方程式在那里绘制,而不仅仅是在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()

3 个答案:

答案 0 :(得分:1)

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

enter image description here

答案 1 :(得分:0)

连续性很难复制,听起来您需要增加绘图密度。更改循环并使用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()

答案 2 :(得分:0)

如果我理解您的问题,则希望基于当前轴的平移/缩放来动态地重新计算绘图的内容(坐标)。为此,需要使用event handling来检测轴范围的变化,然后使用这些范围之间的预定义数量的点重新计算坐标,并最终相应地更新图

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展示了如何在更改轴限制in this answer时连接事件处理程序