简体   繁体   English

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

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

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 .pyplot.figure完美配合,但使用matplotlib.Figure它只删除灰色背景,框架保持不变。 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.使用 pyplot 我可以做我想做的事,我想用 matplotlib 做它出于某种原因我宁愿不提扩展我的问题。

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 spines object on the axis.对于那些只想移除框架(边框)并保留标签、代码等的人,可以通过访问轴上的spines对象来做到这一点。 Given an axis object ax , the following should remove borders on all four sides:给定一个轴对象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 x and y ticks from the plot:并且,如果从图中删除xy刻度:

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

First off, if you're using savefig , be aware that it will override the figure's background color when saving unless you specify otherwise (eg 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.patch and fig.patch to be invisible.但是,要在屏幕上删除轴和图形的背景,您需要将ax.patchfig.patch设置为不可见。

Eg例如

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...) (当然,你看不出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)

在此处输入图片说明

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)

在此处输入图片说明

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)

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

在此处输入图片说明

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您可以使用上面的命令删除框架,然后保留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):最终的情节可能是这样的(代码可以在下面找到):

在此处输入图片说明

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

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

Problem问题

I had a similar problem using axes.我在使用轴时遇到了类似的问题。 The class parameter is frameon but the kwarg is frame_on .类参数是frameon但 kwarg 是frame_on axes_api轴_api
>>> plt.gca().set(frameon=False)
AttributeError: Unknown property frameon

Solution解决方案

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

I use to do so:我习惯这样做:

from pylab import *
axes(frameon = 0)
...
show()
plt.axis('off')
plt.savefig(file_path, bbox_inches="tight", pad_inches = 0)

plt.savefig has those options in itself, just need to set axes off before plt.savefig 本身就有这些选项,只需要在设置轴之前关闭

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

should do the trick.应该做的伎俩。

here is another solution :这是另一个解决方案:

img = io.imread(crt_path)

fig = plt.figure()
fig.set_size_inches(img.shape[1]/img.shape[0], 1, forward=False) # normalize the initial size
ax = plt.Axes(fig, [0., 0., 1., 1.]) # remove the edges
ax.set_axis_off() # remove the axis
fig.add_axes(ax)

ax.imshow(img)

plt.savefig(file_name+'.png', dpi=img.shape[0]) # de-normalize to retrieve the original size

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM