Answers:
首先,如果您使用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)
(当然,您不能说出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)
但是,在这种情况下,您可能希望使轴占据整个图形。如果您手动指定轴的位置,则可以告诉它占用完整的数字(或者,可以使用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)
ax.axis('off')
(您仍然需要关闭数字框)。
ax.set_yticklabels(('G1', 'G2', 'G3'))
print_png()
抛出一个TypeError: write() argument must be str, not bytes
关于蟒蛇3.打开文件写二进制文件(对我来说异常'wb'
)需要为它工作。
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)
并且,从情节中删除x
和剔除y
:
ax.get_xaxis().set_ticks([])
ax.get_yaxis().set_ticks([])
ax.yaxis.set_ticks_position('left') ax.xaxis.set_ticks_position('bottom')
以@peeol的出色答案为基础,您也可以通过以下方法删除框架
for spine in plt.gca().spines.values():
spine.set_visible(False)
举个例子(整个代码示例可以在本文的结尾处找到),假设您有一个这样的条形图,
您可以使用上面的命令删除框架,然后保留x-
和ytick
标签(未显示图)或也删除它们
plt.tick_params(top='off', bottom='off', left='off', right='off', labelleft='off', labelbottom='on')
在这种情况下,可以直接在条形上贴标签;最终的图看起来像这样(代码可以在下面找到):
这是生成图所必需的全部代码:
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()
我在使用轴时遇到了类似的问题。class参数为,frameon
但kwarg为frame_on
。 axes_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()
删除图表框架
for spine in plt.gca().spines.values():
spine.set_visible(False)
我希望这可以工作
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')
savefig
吗?(如果是这样,它将覆盖您在保存图形时设置的任何内容。)手动设置是否fig.patch.set_visible(False)
有效?