How to remove frame from matplotlib (pyplot.figure vs matplotlib.figure ) (frameon=False Problematic in matplotlib)

匿名 (未验证) 提交于 2019-12-03 02:29:01

问题:

To remove frame in figure, I write

frameon=False

works perfect with pyplot.figure, but with matplotlib.Figure it only removes the gray background, the frame stays . Also, I only want the lines to show, and all the rest of figure be transparent.

with pyplot I can do what I want, I want to do it with matplotlib for some long reason I 'd rather not mention to extend my question.

回答1:

First off, if you're using savefig, be aware that it will override the figure's background color when saving unless you specify otherwise (e.g. fig.savefig('blah.png', transparent=True)).

However, to remove the axes' and figure's background on-screen, you'll need to set both ax.patch and fig.patch to be invisible.

E.g.

import matplotlib.pyplot as plt  fig, ax = plt.subplots() ax.plot(range(10))  for item in [fig, ax]:     item.patch.set_visible(False)  with open('test.png', 'w') as outfile:     fig.canvas.print_png(outfile)

(Of course, you can't tell the difference on SO's white background, but everything is transparent...)

If you don't want to show anything other than the line, turn the axis off as well using ax.axis('off'):

import matplotlib.pyplot as plt  fig, ax = plt.subplots() ax.plot(range(10))  fig.patch.set_visible(False) ax.axis('off')  with open('test.png', 'w') as outfile:     fig.canvas.print_png(outfile)

In that case, though, you may want to make the axes take up the full figure. If you manually specify the location of the axes, you can tell it to take up the full figure (alternately, you can use subplots_adjust, but this is simpler for the case of a single axes).

import matplotlib.pyplot as plt  fig = plt.figure(frameon=False) ax = fig.add_axes([0, 0, 1, 1]) ax.axis('off')  ax.plot(range(10))  with open('test.png', 'w') as outfile:     fig.canvas.print_png(outfile)



回答2:

ax.axis('off'), will as Joe Kington pointed out, remove everything except the plotted line.

For those wanting to only remove the frame (border), and keep labels, tickers etc, one can do that by accessing the spines object on the axis. Given an axis object ax, the following should remove borders on all four sides:

ax.spines['top'].set_visible(False) ax.spines['right'].set_visible(False) ax.spines['bottom'].set_visible(False) ax.spines['left'].set_visible(False)

And, in case of removing x and y ticks from the plot:

 ax.get_xaxis().set_ticks([])  ax.get_yaxis().set_ticks([])


回答3:

Building up on @peeol's excellent answer, you can also remove the frame by doing

for spine in plt.gca().spines.values():     spine.set_visible(False)

To give an example (the entire code sample can be found at the end of this post), let's say you have a bar plot like this,

you can remove the frame with the commands above and then either keep the x- and ytick labels (plot not shown) or remove them as well doing

plt.tick_params(top='off', bottom='off', left='off', right='off', labelleft='off', labelbottom='on')

In this case, one can then label the bars directly; the final plot could look like this (code can be found below):

Here is the entire code that is necessary to generate the plots:

import matplotlib.pyplot as plt import numpy as np  plt.figure()  xvals = list('ABCDE') yvals = np.array(range(1, 6))  position = np.arange(len(xvals))        
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!