【问题标题】:What is the right version of matplotlib for sympy 1.0?什么是 sympy 1.0 的正确 matplotlib 版本?
【发布时间】:2017-11-14 05:19:42
【问题描述】:

我尝试在 Pycharm 中使用 Sympy(1.0) 的绘图模块,但遇到如下错误。我猜这是由 matplotlib(2.0.2) 和 Sympy(1.0) 之间的版本不兼容引起的。有人有线索吗?先谢谢了~

Traceback (most recent call last):
  File "/home/leizh/PycharmProjects/Learn_python/Smoothness_Bilinear_Quadrilateral_Elmt.py", line 49, in <module>
    plot_parametric(cos(u),sin(u),(u,-5,5))
  File "/home/leizh/.local/lib/python3.5/site-packages/sympy/plotting/plot.py", line 1415, in plot_parametric
    plots.show()
  File "/home/leizh/.local/lib/python3.5/site-packages/sympy/plotting/plot.py", line 184, in show
    self._backend = self.backend(self)
  File "/home/leizh/.local/lib/python3.5/site-packages/sympy/plotting/plot.py", line 1056, in __new__
    return MatplotlibBackend(parent)
  File "/home/leizh/.local/lib/python3.5/site-packages/sympy/plotting/plot.py", line 868, in __init__
    self.cm = self.matplotlib.cm
AttributeError: 'NoneType' object has no attribute 'cm'

代码用于计算双线性四边形元素的映射。

from sympy import *
from sympy.plotting import *

xi = Symbol("xi")
eta = Symbol("eta")

#Shape functions in reference element
def Ni(xi,eta,i):
    references_vertices = {1:[-1,-1],2:[1,-1],3:[1,1],4:[-1,1]}
    xiv = references_vertices[i][0]
    etav = references_vertices[i][1]
    return Rational(1,4)*(1+xiv*xi)*(1+etav*eta)

#Give a specific element in physical space with an angle >= 180 degree
physical_vertices = {1:[-1,-1],2:[1,-1],3:[1,1],4:[0,0]}

#Interpolation for (x,y) in terms of (xi,eta)
def mapping(xi,eta,vertices):
    x = 0
    y = 0
    for i in vertices:
        xv = vertices[i][0]
        yv = vertices[i][1]
        x += Ni(xi,eta,i)*xv
        y += Ni(xi,eta,i)*yv
    return [x,y]

#mapping (xi, eta) -> (x, y)
xy = mapping(xi,eta,physical_vertices)
print("x and y")
print(factor(xy[0]))
print(factor(xy[1]))

#Jacobian
jac = []
jac.append([xy[0].diff(xi),xy[0].diff(eta)])
jac.append([xy[1].diff(xi),xy[1].diff(eta)])

print("Jacobian Matrix")
print(factor(jac))

#The determinant of Jacobian
det_jac = jac[0][0]*jac[1][1]-jac[0][1]*jac[1][0]
print(factor(det_jac))

#Plot
plot3d_parametric_surface(xy[0], xy[1], det_jac,(xi,-1,1),(eta,-1,1))
det_jac.subs([(xi,1),(eta,-1)])

#test
u = symbols('u')
plot(u**2,(u,-1,1))
plot_parametric(cos(u),sin(u),(u,-5,5))

【问题讨论】:

  • 你看到这个问题了吗? stackoverflow.com/questions/8949252/…
  • 在 python 3.5.3、matplotlib 2.0.2 和 sympy 1.0 中使用全新的虚拟环境,运行流畅如初。 sympy.plotting.plot_parametric(sympy.cos(u), sympy.sin(u), (u,-5,5)) 在我的屏幕上呈现一个漂亮的圆圈。可能你在pycharm中遇到过bug?我想发布您的代码中重现您的错误的相关部分会有所帮助。
  • 感谢您的帮助。我刚刚添加了原始代码。通过执行,问题位于文件 sympy.plot.py 的行:self.matplotlib = import_module('matplotlib', __import__kwargs={'fromlist': ['pyplot', 'cm', 'collections']}, min_module_version='1.1.0', catch=(RuntimeError,))。它无法导入模块 matplotlib。所以我明白它为什么会产生错误但仍然不知道如何解决它。
  • 安装python3-tk包解决了问题。

标签: python matplotlib sympy


【解决方案1】:

我已经能够使用 matplotlib 2.0.2、sympy 1.0 和 python 3.4.6 重现您的问题。但是使用 matplotlib 2.0.2、sympy 1.0 和 python 3.5.3 工作得很好。请注意,我使用的是不同的计算机,但每次都是新的虚拟环境。所以这里应该没有其他问题。我建议升级到 python 3.5.x。

以后请提供一个“最小”的工作示例来重现您的错误,例如:

import sympy as sym

u = sym.symbols('u')

sym.plotting.plot(sym.sin(u), (u,-5,5))

编辑:两台计算机之间存在差异:一台使用 qt4agg 后端(不工作),另一台使用 tkagg(工作)。因此,关于使用 sympy 和 matplotlib 的后端似乎存在问题。

【讨论】:

  • 感谢您的帮助。通过安装包 python3-tk 在我的计算机上解决了这个问题。您对使用 matplotlib 的后端是正确的。所以 Sympy 和 Matplotlib 之间的兼容性不是问题。也许我需要更改问题的标题...
猜你喜欢
  • 2010-09-19
  • 2019-04-30
  • 2020-09-20
  • 1970-01-01
  • 1970-01-01
  • 2012-06-22
  • 1970-01-01
  • 2017-11-05
  • 1970-01-01
相关资源
最近更新 更多