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