如何用曲线轴替换 Matplotlib 轴
How to replace a Matplotlib axis with a curvilinear axis
文档 here 中有一个很好的曲线轴网格示例。这假设您有一个空图形,然后使用以下方法创建曲线轴:
ax1 = Subplot(fig, 1, 2, 1, grid_helper=grid_helper)
但是,我正在编写一个给定现有轴的函数,我希望该函数用新的曲线轴替换该轴 (ax
)。
到目前为止,这是我函数的开始:
import matplotlib.pyplot as plt
from mpl_toolkits.axisartist import SubplotHost
from mpl_toolkits.axisartist.grid_helper_curvelinear import GridHelperCurveLinear
import mpl_toolkits.axisartist.angle_helper as angle_helper
from matplotlib.projections import PolarAxes
from matplotlib.transforms import Affine2D
def sgrid(ax=None):
"""
Adds an s-plane grid of constant damping factors and natural
frequencies to a plot. If ax is not specified, the current
figure axis is used.
Parameters
----------
ax : matplotlib axis object
If not passed, uses gca() to get current axis.
Returns
-------
ax : matplotlib axis
"""
grid_helper = GridHelperCurveLinear(
... some stuff ...
)
if ax is None:
# Get the current axis or create a new figure with one
ax = plt.gca()
fig = ax.figure
# TODO: How can we change the axis if it is already created?
ax = SubplotHost(fig, 1, 1, 1, grid_helper=grid_helper)
... (code that adds more stuff to ax) ...
return ax
此外,我不确定我是否理解 SubplotHost
的论点。这些是新 Axis 的初始化参数还是什么?
更新
此处的目标是模拟 Pandas.Series.plot 函数的工作方式。所需的用例是这样的:
H = tf([2, 5, 1],[1, 2, 3])
rlocus(H)
sgrid()
plt.show()
或
>>> fig, axes = plt.subplots(2, 1)
>>> rlocus(H1, ax=axes[1])
>>> rlocus(H2, ax=axes[2])
>>> for ax in axes:
>>> sgrid(ax=ax) # Later we might want to add ax.zgrid()
>>> plt.show()
sgrid
和 rlocus
的顺序理想情况下应该像上面那样,因为这类似于我们正在模拟的 MATLAB 函数以及它们类似于的 plt.grid()
方法。
grid_helper
是 mpl_toolkits.axisartist.axislines.Axes
的关键字。
https://matplotlib.org/api/_as_gen/mpl_toolkits.axisartist.axislines.html
您可能想要检查提供的轴是否是此 Axes 扩展的子类,否则重新创建轴:
from mpl_toolkits.axisartist import SubplotHost,axislines
...
def sgrid(ax1=None):
...
if ax1 is None:
ax1=plt.gca()
fig=ax1.figure
if not isinstance(ax1,axislines.Axes):
subargs=ax1.get_geometry()
fig.delaxes(ax1)
ax2 = SubplotHost(fig, *subargs, grid_helper=grid_helper)
fig.add_subplot(ax2)
else:
ax2=ax1
...
return ax2
请注意,sgrid()
的调用者仍然引用不再是图的一部分的 ax1
。可能有比仅仅删除和重新创建更复杂的轴参考替换。
文档 here 中有一个很好的曲线轴网格示例。这假设您有一个空图形,然后使用以下方法创建曲线轴:
ax1 = Subplot(fig, 1, 2, 1, grid_helper=grid_helper)
但是,我正在编写一个给定现有轴的函数,我希望该函数用新的曲线轴替换该轴 (ax
)。
到目前为止,这是我函数的开始:
import matplotlib.pyplot as plt
from mpl_toolkits.axisartist import SubplotHost
from mpl_toolkits.axisartist.grid_helper_curvelinear import GridHelperCurveLinear
import mpl_toolkits.axisartist.angle_helper as angle_helper
from matplotlib.projections import PolarAxes
from matplotlib.transforms import Affine2D
def sgrid(ax=None):
"""
Adds an s-plane grid of constant damping factors and natural
frequencies to a plot. If ax is not specified, the current
figure axis is used.
Parameters
----------
ax : matplotlib axis object
If not passed, uses gca() to get current axis.
Returns
-------
ax : matplotlib axis
"""
grid_helper = GridHelperCurveLinear(
... some stuff ...
)
if ax is None:
# Get the current axis or create a new figure with one
ax = plt.gca()
fig = ax.figure
# TODO: How can we change the axis if it is already created?
ax = SubplotHost(fig, 1, 1, 1, grid_helper=grid_helper)
... (code that adds more stuff to ax) ...
return ax
此外,我不确定我是否理解 SubplotHost
的论点。这些是新 Axis 的初始化参数还是什么?
更新
此处的目标是模拟 Pandas.Series.plot 函数的工作方式。所需的用例是这样的:
H = tf([2, 5, 1],[1, 2, 3])
rlocus(H)
sgrid()
plt.show()
或
>>> fig, axes = plt.subplots(2, 1)
>>> rlocus(H1, ax=axes[1])
>>> rlocus(H2, ax=axes[2])
>>> for ax in axes:
>>> sgrid(ax=ax) # Later we might want to add ax.zgrid()
>>> plt.show()
sgrid
和 rlocus
的顺序理想情况下应该像上面那样,因为这类似于我们正在模拟的 MATLAB 函数以及它们类似于的 plt.grid()
方法。
grid_helper
是 mpl_toolkits.axisartist.axislines.Axes
的关键字。
https://matplotlib.org/api/_as_gen/mpl_toolkits.axisartist.axislines.html
您可能想要检查提供的轴是否是此 Axes 扩展的子类,否则重新创建轴:
from mpl_toolkits.axisartist import SubplotHost,axislines
...
def sgrid(ax1=None):
...
if ax1 is None:
ax1=plt.gca()
fig=ax1.figure
if not isinstance(ax1,axislines.Axes):
subargs=ax1.get_geometry()
fig.delaxes(ax1)
ax2 = SubplotHost(fig, *subargs, grid_helper=grid_helper)
fig.add_subplot(ax2)
else:
ax2=ax1
...
return ax2
请注意,sgrid()
的调用者仍然引用不再是图的一部分的 ax1
。可能有比仅仅删除和重新创建更复杂的轴参考替换。