Python matplotlib ValueError for logit scale axis label

匿名 (未验证) 提交于 2019-12-03 08:46:08

问题:

I'm getting what looks like a label positioning error when setting a label for a logit scale axis using matplotlib, here's my example:

import matplotlib.pyplot as plt; from matplotlib.ticker import FormatStrFormatter;  x = [1,2,3,4,5]; y = [0.1,0.2,0.3,0.4,0.5];  fig,ax = plt.subplots();  ax.set_ylim([0.005,0.99]); ax.set_yscale('logit'); ax.yaxis.set_minor_formatter(FormatStrFormatter(""));     ax.set_xlabel("X axis"); ax.set_ylabel("Y axis"); #set y axis label (logit scale)  ax.plot(x,y); plt.show(); plt.close(); 

Here's the trace:

Traceback (most recent call last):   File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/matplotlib/backends/backend_macosx.py", line 136, in _draw     self.figure.draw(renderer)   File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/matplotlib/artist.py", line 63, in draw_wrapper     draw(artist, renderer, *args, **kwargs)   File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/matplotlib/figure.py", line 1143, in draw     renderer, self, dsu, self.suppressComposite)   File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/matplotlib/image.py", line 139, in _draw_list_compositing_images     a.draw(renderer)   File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/matplotlib/artist.py", line 63, in draw_wrapper     draw(artist, renderer, *args, **kwargs)   File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/matplotlib/axes/_base.py", line 2409, in draw     mimage._draw_list_compositing_images(renderer, self, dsu)   File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/matplotlib/image.py", line 139, in _draw_list_compositing_images     a.draw(renderer)   File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/matplotlib/artist.py", line 63, in draw_wrapper     draw(artist, renderer, *args, **kwargs)   File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/matplotlib/axis.py", line 1150, in draw     self.label.draw(renderer)   File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/matplotlib/artist.py", line 63, in draw_wrapper     draw(artist, renderer, *args, **kwargs)   File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/matplotlib/text.py", line 762, in draw     raise ValueError("posx and posy should be finite values") ValueError: posx and posy should be finite values 

Works great when I omit

ax.set_ylabel("Y axis"); #set y axis label (logit scale) 

It doesn't seem to matter of the label is set before or after the axis scale. Anyone know how to work around this?

回答1:

There is a bug in the way the text label is set, which results in a non-numeric bounding box for logit scales, see this issue on GitHub.

The solution is to add

ax.spines['left']._adjust_location() 

(where 'left' can be replaced by 'right', 'top', 'bottom' depending on the axis one is interested in) in the code.

Complete example:

import matplotlib.pyplot as plt  x = [1,2,3,4,5] y = [0.05,0.2,0.3,0.4,0.95]  fig,ax = plt.subplots()  ax.set_yscale('logit')  ax.set_xlabel("X axis") ax.set_ylabel("Y axis") ax.spines['left']._adjust_location()  ax.plot(x,y) plt.show() 



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!