检索用于SymPy图的matplotlib ContourSet

时间:2017-01-10 16:02:48

标签: python matplotlib plot sympy

使用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()时,contour plot 14x10更新:我有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的访问权限?

2 个答案:

答案 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))

enter image description here

答案 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])

哪个会产生figfigfig2fig2