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

问题描述 投票:0回答:3

我正在尝试创建一个交互式图表。我无法弄清楚如何绘制连续的二次图 - 如果你在轴上缩小/移动,那么在那里绘制方程,而不仅仅是在2 x点之间,所以它是连续的。

到目前为止我已经有了这个。

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()
python python-3.x matplotlib plot graph
3个回答
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


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

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

© www.soinside.com 2019 - 2024. All rights reserved.