在同意情节中,如何获得具有固定宽高比的情节?

时间:2016-04-08 17:26:43

标签: python plot sympy

如果我使用此代码段绘制一个圆圈

from sympy import *
x, y = symbols('x y')        
p1 = plot_implicit(Eq(x**2 +y**2, 1),aspect_ratio=(1.,1.))

我会得到一个像这样的数字窗口

enter image description here

现在纵横比不是我所期待的,因为我看到的是椭圆而不是圆形。此外,如果我改变窗口的宽高比(拖动窗口的右下角),我也得到了图的宽高比的变化......下面的图像就是我的内容拖动角落后看到一个圆圈:

enter image description here

我想设置一个类似你在Matlab设置axis equal时得到的情节,在绘制椭圆时看http://it.mathworks.com/help/matlab/creating_plots/aspect-ratio-for-2-d-axes.html

enter image description here

我错过了什么?

我正在使用Jupyter,笔记本服务器的版本是4.1.0并且正在运行:Python 2.7.11 | Anaconda 2.5.0(64位)| (默认,2015年12月6日,18:08:32)[GCC 4.4.7 20120313(红帽4.4.7-1)]

3 个答案:

答案 0 :(得分:2)

我不确定Sympy的稳定API是否涵盖了这一点,但您可以提取matplotlib的图形和轴实例,并使用标准的matplotlib调用来改变图形的外观:

import matplotlib.pyplot as plt
import sympy as sy

x, y = sy.symbols('x y')
p1 = sy.plot_implicit(sy.Eq(x**2 +y**2, 4))
fg, ax = p1._backend.fig, p1._backend.ax  # get matplotib's figure and ax

# Use matplotlib to change appearance: 
ax.axis('tight')  # list of float or {‘on’, ‘off’, ‘equal’, ‘tight’, ‘scaled’, ‘normal’, ‘auto’, ‘image’, ‘square’}
ax.set_aspect("equal") # 'auto', 'equal' or a positive integer is allowed
ax.grid(True)
fg.canvas.draw()


plt.show()  # enter matplotlib's event loop (not needed in Jupyter)

这给出了: Tight Axis with equal aspect ratio

答案 1 :(得分:1)

现在在2019年9月,此代码有效:

import matplotlib.pyplot as plt
import sympy

x, y = sympy.symbols('x y')

plt.ion() #interactive on 

p1 = sympy.plot_implicit(sympy.Eq(x**2 +y**2, 4), block = False)

fg, ax = p1._backend.fig, p1._backend.ax  # get matplotib's figure and axes

# Use matplotlib to change appearance:
ax.axis('tight')  # list of float or {‘on’, ‘off’, ‘equal’, ‘tight’, ‘scaled’, ‘normal’, ‘auto’, ‘image’, ‘square’}
ax.set_aspect("equal") # 'auto', 'equal' or a positive integer is allowed
ax.grid(True)
plt.ioff() #interactive off
plt.show()

答案 2 :(得分:0)

plot_implicit的帮助中,提到了x_vary_var - 参数。使用它们可以手动设置x轴和y轴的限制。如果适当缩放这些限制,则可以获得均匀的宽高比     

from sympy import *

x, y = symbols('x y')

scal = 3840/2400 # corresponds to your screen resolution
a = 1.05

p1 = plot_implicit(Eq(x**2+y**2,1),title='with xlim and ylim\n',\
                   xlim=(-1,1), ylim=(-1,1),aspect_ratio='equal')

p2 = plot_implicit(Eq(x**2+y**2,1),title='with x_var and y_var\n',\
                   x_var=(x,-a*scal,a*scal), y_var=(y,-a,a))

(My Sympy-version:1.1.1)