如何使用matplotlib创建具有连续轴的图形?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用matplotlib创建具有连续轴的图形?相关的知识,希望对你有一定的参考价值。
我正在尝试创建一个交互式图表。我无法弄清楚如何绘制连续的二次图 - 如果你在轴上缩小/移动,那么在那里绘制方程,而不仅仅是在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()
答案
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()
另一答案
如果我理解您的问题,您希望根据当前轴平移/缩放动态重新计算绘图内容(坐标)。这样做需要使用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
以上是关于如何使用matplotlib创建具有连续轴的图形?的主要内容,如果未能解决你的问题,请参考以下文章
Matplotlib 使用GridSpec和其他功能自定义图形布局
Python/Matplotlib - 有没有办法制作一个不连续的轴?