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

Emm*_*t B 127 python matplotlib

为了删除图中的帧,我写了

frameon=False
Run Code Online (Sandbox Code Playgroud)

与之完美搭配pyplot.figure,但只有matplotlib.Figure它才能消除灰色背景,框架保持不变.另外,我只想显示线条,图中所有其余部分都是透明的.

使用pyplot我可以做我想做的事情,我想用matplotlib来做这件事有一个长期的原因我宁愿不提及我的问题.

pee*_*eol 200

ax.axis('off'),正如Joe Kington指出的那样,删除除绘制线之外的所有内容.

对于那些只想删除框架(边框),并保留标签,代码等的人,可以通过访问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)
Run Code Online (Sandbox Code Playgroud)

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

 ax.get_xaxis().set_ticks([])
 ax.get_yaxis().set_ticks([])
Run Code Online (Sandbox Code Playgroud)

  • 只是添加:当你还要删除刻度:`ax.yaxis.set_ticks_position('left')ax.xaxis.set_ticks_position('bottom')` (5认同)
  • 另外,如果您还没有轴对象,请使用ax = gca()创建轴对象. (4认同)
  • 我喜欢这个摆脱顶部和右侧的刺 (3认同)
  • 这应该是公认的答案."ax.axis("off")"从图中删除所有内容:x和y标签,x和y标记以及所有(4)边框.为了更好地定制,应该以不同方式处理每个元素. (2认同)

Joe*_*ton 149

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

但是,要在屏幕上移除轴和图形的背景,您需要设置两者ax.patch并且fig.patch不可见.

例如

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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

(当然,你无法区分SO的白色背景,但一切都是透明的......)

如果您不想显示除线以外的任何内容,请使用以下方法关闭轴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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

但是,在这种情况下,您可能希望使轴占据整个数字.如果您手动指定轴的位置,您可以告诉它占据整个图形(或者,您可以使用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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 哦,那么,在这种情况下,它甚至更简单.只需使用`ax.axis('off')`(你仍然需要关闭数字框架). (4认同)
  • 在 python 3 上, `print_png()` 抛出一个 `TypeError: write() argument must be str, not bytes` 异常。需要将文件作为写入二进制文件 (`'wb'`) 打开才能工作。 (2认同)

Cle*_*leb 49

建立@ peeol的优秀答案,你也可以通过去除框架

for spine in plt.gca().spines.values():
    spine.set_visible(False)
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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

plt.tick_params(top='off', bottom='off', left='off', right='off', labelleft='off', labelbottom='on')
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

以下是生成绘图所需的完整代码:

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()
Run Code Online (Sandbox Code Playgroud)


nev*_*ves 39

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

import matplotlib.pyplot as plt
plt.box(False)
Run Code Online (Sandbox Code Playgroud)

  • 当使用面向对象的方法时,我成功地使用了“ax.set_frame_on(False)”,它做了同样的事情。也许包括在上面的答案中。 (4认同)
  • 谢谢!这可能是最干净的解决方案! (2认同)
  • 这将删除整个框/矩形,而不仅仅是框架/边框。可能是也可能不是您想要的。 (2认同)

had*_*enj 10

正如我在此处回答的那样,您可以通过样式设置(样式表或 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
Run Code Online (Sandbox Code Playgroud)


A. *_*est 9

问题

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

解决方案

frame_on

例子

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()
Run Code Online (Sandbox Code Playgroud)


小智 6

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')
Run Code Online (Sandbox Code Playgroud)


小智 6

plt.axis('off')
plt.savefig(file_path, bbox_inches="tight", pad_inches = 0)
Run Code Online (Sandbox Code Playgroud)

plt.savefig 本身有这些选项,只需要在之前将轴设置为关闭


ali*_*oar 5

我习惯这样做:

from pylab import *
axes(frameon = 0)
...
show()
Run Code Online (Sandbox Code Playgroud)