Skip to content

I'm having problems with the ax parameters of the rlocus function #623

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
jolenscki opened this issue May 22, 2021 · 5 comments · Fixed by #662
Closed

I'm having problems with the ax parameters of the rlocus function #623

jolenscki opened this issue May 22, 2021 · 5 comments · Fixed by #662
Labels

Comments

@jolenscki
Copy link

I was trying today to plot the root locus of a transfer function, but wanted to pass a specific axes object to it, so I tried to use the ax parameter of the rlocus function:

from control import *
import matplotlib.pyplot as plt

s = tf([1, 0], 1)
G = 1/(s*(s+1))

fig, ax = plt.subplots(dpi=200)
rlocus(G, ax=ax)

But when doing this, the following error was raised:

---------------------------------------------------------------------------
UnboundLocalError                         Traceback (most recent call last)
<ipython-input-1-80498c4b1a54> in <module>
      6 
      7 fig, ax = plt.subplots(dpi=200)
----> 8 rlocus(G, ax=ax)

~\anaconda3\lib\site-packages\control\rlocus.py in root_locus(sys, kvect, xlim, ylim, plotstr, plot, print_gain, grid, ax, **kwargs)
    173 
    174         if print_gain and not sisotool:
--> 175             fig.canvas.mpl_connect(
    176                 'button_release_event',
    177                 partial(_RLClickDispatcher, sys=sys, fig=fig,

UnboundLocalError: local variable 'fig' referenced before assignment

Control version: 0.9.0

@sawyerbfuller
Copy link
Contributor

Looks like you caught a bug, thanks! I think when we implemented this we had what you intended in mind but didn’t get around to testing it.

@billtubbs
Copy link
Contributor

It's not too difficult to fix. I think we just need to unindent lines 171 and 172 by one tab:

if ax is None:
ax = plt.gca()
fig = ax.figure
ax.set_title('Root Locus')

@billtubbs
Copy link
Contributor

billtubbs commented Aug 9, 2021

I'm happy to implement this immediate fix (and #632 at the same time) and maybe add some unit tests, including for other plot functions where applicable. If I recall correctly, I was trying to do this a while back and the problem is that some plot funcs need to generate their own axis (e.g. radial plots) and some generate a figure containing more than one axis.

@bnavigator
Copy link
Contributor

If you manage to also fix #634 while you are at it, it would be a blast. Not sure if it is worth to be done before/without implementing the new plotting paradigm, proposed by you in #65 (comment)

@billtubbs
Copy link
Contributor

I'll have a look at #634. But I'm waiting for further input on the new plotting paradigm. That will require more thinking and discussion and probably take a while to figure out a way forward. There might be better ways to do it. I'm happy to try fixing the immediate bugs on the existing functions when I next get the chance.

@sawyerbfuller sawyerbfuller linked a pull request Nov 4, 2021 that will close this issue
sawyerbfuller added a commit to sawyerbfuller/python-control that referenced this issue Nov 4, 2021
sawyerbfuller added a commit to sawyerbfuller/python-control that referenced this issue Nov 4, 2021
sawyerbfuller added a commit to sawyerbfuller/python-control that referenced this issue Nov 5, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging a pull request may close this issue.

5 participants