使用SymPy,我可以使用以下代码手动创建轮廓图(还没有内置的轮廓绘图功能 更新:{{3} }):
from sympy import init_session
init_session()
from sympy.plotting.plot import Plot, ContourSeries
# show plot centered at 0,0
x_min = -7
x_max = 7
y_min = -5
y_max = 5
# contour plot of inverted cone
my_plot = Plot(
ContourSeries(
sqrt(x**2 + y**2),
(x,x_min,x_max),
(y,y_min,y_max)
)
)
my_plot.show()
SymPy now has a contour plotting function
目前,当SymPy调用contour()
时,(更新:我有it does not appear to be saving the returned ContourSet以查看是否可以保存ContourSet):
class MatplotlibBackend(BaseBackend):
...
def process_series(self):
...
for s in self.parent._series:
# Create the collections
...
elif s.is_contour:
self.ax.contour(*s.get_meshes()) # returned ContourSet not saved by SymPy
在对绘图执行修改的其他示例中,例如filed a issue,需要ContourSet(CS
):
# Create a simple contour plot with labels using default colors.
plt.figure()
CS = plt.contour(X, Y, Z) # CS is the ContourSet
plt.clabel(CS, inline=1, fontsize=10)
plt.title('Simplest default with labels')
adding inline labels using clabel()
回到SymPy示例,my_plot._backend
确实提供了对图形和轴的访问;有什么办法可以保持或获得对ContourSet的访问权限?
答案 0 :(得分:3)
SymPy的内置绘图功能达不到你想要的一个选项就是直接使用matplotlib。关键是使用lambdify
将SymPy表达式转换为NumPy函数。
f = lambdify((x, y), sqrt(x**2 + y**2), 'numpy')
下面创建一个等高线图,c
作为ContourSet对象。
a = numpy.linspace(-7, 7, 1000)
b = numpy.linspace(-5, 5, 1000)
x, y = numpy.meshgrid(a, b)
c = matplotlib.pyplot.contour(x, y, f(x, y))
答案 1 :(得分:1)
在this question中,您了解到需要保留对等高线图的参考,您可以从中检索点。对于“标签最简单的默认设置”,CS.collections[0].get_paths()
。
但我找不到从给定的axes
对象中检索绘图列表的方法......
在下面的代码中,C
包含所需的行集合,但在等高线图中每个级别有一个集合,并带有一些缩放:
import numpy as np
import matplotlib.pylab as plt
X = np.arange(10)
Y = np.arange(10)
Z = np.random.random((10,10))
fig = plt.figure()
ax = fig.add_subplot(111)
A = ax.get_children()
cs = ax.contour (X, Y, Z)
B = ax.get_children()
C = [ref for ref in B if ref not in A]
fig2 = plt.figure()
ax2 = fig2.add_subplot(111)
ax2.add_collection(C[0])