Python 如何从 matplotlib 中删除框架(pyplot.figure 与 matplotlib.figure )(frameon=False 在 matplotlib 中有问题)

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/14908576/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-18 12:49:17  来源:igfitidea点击:

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

pythonmatplotlib

提问by Emmet B

To remove frame in figure, I write

要删除图中的框架,我写

frameon=False

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

与 完美配合pyplot.figure,但matplotlib.Figure它只会删除灰色背景,框架保持 。另外,我只希望线条显示,其余的图形都是透明的。

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.

使用 pyplot 我可以做我想做的事,出于某种原因,我想用 matplotlib 做这件事,我宁愿不提扩展我的问题。

采纳答案by Joe Kington

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)).

首先,如果您使用的savefig是 ,请注意,除非您另行指定(例如fig.savefig('blah.png', transparent=True)),否则保存时它将覆盖图形的背景颜色。

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

然而,除去轴和数字屏幕上的背景,你需要同时设置ax.patchfig.patch不可见。

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)

enter image description here

在此处输入图片说明

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

(当然,你看不出SO的白色背景有什么不同,但一切都是透明的......)

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

如果您不想显示线以外的任何内容,也可以使用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)

enter image description here

在此处输入图片说明

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).

但是,在这种情况下,您可能希望使轴占据整个图形。如果您手动指定轴的位置,您可以告诉它占据整个图形(或者,您可以使用subplots_adjust,但这对于单个轴的情况更简单)。

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)

enter image description here

在此处输入图片说明

回答by alinsoar

I use to do so:

我习惯这样做:

from pylab import *
axes(frameon = 0)
...
show()

回答by peeol

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

ax.axis('off'),正如乔金顿所指出的那样,删除除绘制线以外的所有内容。

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

对于那些只想删除框架(边框)并保留标签、代码等的人,可以通过访问spines轴上的对象来做到这一点。给定一个轴对象ax,以下内容应删除所有四个边的边框:

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 xand yticks from the plot:

并且,如果从图中删除xy勾选:

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

回答by Cleb

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

@peeol 的优秀答案为基础,您还可以通过执行以下操作来移除框架

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,

举个例子(整个代码示例可以在这篇文章的末尾找到),假设你有一个这样的条形图,

enter image description here

在此处输入图片说明

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

您可以使用上面的命令删除框架,然后保留x-ytick标签(未显示绘图)或删除它们

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):

在这种情况下,可以直接标记条形;最终的情节可能是这样的(代码可以在下面找到):

enter image description here

在此处输入图片说明

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))

mybars = plt.bar(position, yvals, align='center', linewidth=0)
plt.xticks(position, xvals)

plt.title('My great data')
# plt.show()

# get rid of the frame
for spine in plt.gca().spines.values():
    spine.set_visible(False)

# plt.show()
# remove all the ticks and directly label each bar with respective value
plt.tick_params(top='off', bottom='off', left='off', right='off', labelleft='off', labelbottom='on')

# plt.show()

# direct label each bar with Y axis values
for bari in mybars:
    height = bari.get_height()
    plt.gca().text(bari.get_x() + bari.get_width()/2, bari.get_height()-0.2, str(int(height)),
                 ha='center', color='white', fontsize=15)
plt.show()

回答by neves

The easiest way to get rid of the the ugly frame in newer versions of matplotlib:

在较新版本的 matplotlib 中摆脱丑陋框架的最简单方法:

import matplotlib.pyplot as plt
plt.box(False)

If you really must always use the object oriented approach, then do: ax.set_frame_on(False).

如果你真的必须始终使用面向对象的方法,然后执行:ax.set_frame_on(False)

回答by Taha Kaiyum

df = pd.DataFrame({
'client_scripting_ms' : client_scripting_ms,
 'apimlayer' : apimlayer, 'server' : server
}, index = index)

ax = df.plot(kind = 'barh', 
     stacked = True,
     title = "Chart",
     width = 0.20, 
     align='center', 
     figsize=(7,5))

plt.legend(loc='upper right', frameon=True)

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

ax.yaxis.set_ticks_position('left')
ax.xaxis.set_ticks_position('right')

回答by hhh

As I answered here, you can remove spines from all your plots through style settings (style sheet or rcParams):

正如我在此处回答的那样,您可以通过样式设置(样式表或 rcParams)从所有图中删除脊椎:

import matplotlib as mpl

mpl.rcParams['axes.spines.left'] = False
mpl.rcParams['axes.spines.right'] = False
mpl.rcParams['axes.spines.top'] = False
mpl.rcParams['axes.spines.bottom'] = False

回答by A. West

Problem

问题

I had a similar problem using axes. The class parameter is frameonbut the kwarg is frame_on. axes_api
>>> plt.gca().set(frameon=False)
AttributeError: Unknown property frameon

我在使用轴时遇到了类似的问题。class 参数是,frameon但 kwarg 是frame_on. 轴_api
>>> plt.gca().set(frameon=False)
AttributeError: Unknown property frameon

Solution

解决方案

frame_on

frame_on

Example

例子

data = range(100)
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.plot(data)
#ax.set(frameon=False)  # Old
ax.set(frame_on=False)  # New
plt.show()

回答by user3496912

plt.box(False)
plt.xticks([])
plt.yticks([])
plt.savefig('fig.png')

should do the trick.

应该做的伎俩。

回答by Shabeeh Shakkir

To remove the frame of the chart

删除图表的框架

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

I hope this could work

我希望这可以工作