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.
This question is related to
python
matplotlib
The easiest way to get rid of the the ugly frame in newer versions of 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)
.
plt.box(False)
plt.xticks([])
plt.yticks([])
plt.savefig('fig.png')
should do the trick.
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')
To remove the frame of the chart
for spine in plt.gca().spines.values():
spine.set_visible(False)
I hope this could work
I had a similar problem using axes. The class parameter is frameon
but the kwarg is 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()
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([])
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))
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()
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
I use to do so:
from pylab import *
axes(frameon = 0)
...
show()
As I answered here, you can remove spines from all your plots through style settings (style sheet or 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
Source: Stackoverflow.com