matplotlib에서 프레임을 제거하는 방법 (pyplot.figure vs matplotlib.figure) (frameon = matplotlib에서 잘못된 문제)


160

그림에서 프레임을 제거하기 위해

frameon=False

와 완벽하게 작동 pyplot.figure하지만 matplotlib.Figure회색 배경 만 제거하면 프레임이 유지됩니다. 또한 선만 표시하고 나머지 그림은 모두 투명합니다.

pyplot으로 나는 내가 원하는 것을 할 수 있고, 나는 오랫동안 내 질문을 확장한다고 언급하고 싶지 않은 이유로 matplotlib로 그것을하고 싶다.


하고있는 일을 명확히 할 수 있습니까? (예를 보여줍니다) 사용하고 savefig있습니까? (그렇다면 그림을 저장할 때 설정 한 내용보다 우선합니다.) 수동 설정이 fig.patch.set_visible(False)작동합니까?
Joe Kington

savefig가 아닌 canvas.print_png (응답)을 사용합니다.
Emmet B

답변:


178

먼저을 사용 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)

여기에 이미지 설명을 입력하십시오


이렇게하면 문제의 절반이 해결됩니다. 그러나이 검은 색 프레임 사각형이 보이지 않게하고 싶습니다. 따라서 파란색 선만 표시되어야합니다.
Emmet B

5
아,이 경우에는 훨씬 더 간단합니다. 그냥 사용하십시오 ax.axis('off')(여전히 그림 프레임을 꺼야합니다).
Joe Kington

감사합니다. 다음과 같은 눈금 레이블을 유지하는 방법이 있습니까? 레이블 만 원합니다 ax.set_yticklabels(('G1', 'G2', 'G3'))
Emmet B

: 이것은 내가 여기에 다른 응용 프로그램을 위해 그것을 사용, 대단한 stackoverflow.com/questions/4092927/...
cxrodgers

1
print_png()발생 TypeError: write() argument must be str, not bytes쓰기 이진 파일 (열기 파이썬 3. 나를 위해 예외를 'wb'작업에 대한 필요하다).
가브리엘 Jablonski

243

ax.axis('off')Joe Kington이 지적했듯이 줄거리를 제외한 모든 것을 제거합니다.

프레임 (테두리) 만 제거하고 레이블, 시세 등을 유지하려는 사람들 spines은 축의 객체에 액세스하여 그렇게 할 수 있습니다 . axis 객체가 주어지면 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([])

1
나는 상단과 오른쪽 등뼈를 제거하기 위해 이것을 좋아합니다
Adrian Torrie

5
추가하기 : 진드기를 제거하고 싶을 때 : ax.yaxis.set_ticks_position('left') ax.xaxis.set_ticks_position('bottom')
JLT

4
또한 축 개체가없는 경우 ax = gca ()를 사용하여 축 개체를 만듭니다.
cameronroytaylor 2016 년

2
이것이 정답입니다. "ax.axis ("off ")"는 x 및 y 레이블, x 및 y 틱 및 모든 (4) 테두리를 플롯에서 제거합니다. 더 나은 사용자 정의를 위해서는 각 요소를 다르게 처리해야합니다.
Sanchit

66

최신 버전의 matplotlib에서 못생긴 프레임을 제거하는 가장 쉬운 방법 :

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

항상 객체 지향 접근 방식을 사용해야하는 경우 다음을 수행하십시오 ax.set_frame_on(False)..


2
감사합니다! 이것은 아마도 가장 깨끗한 해결책입니다!
Kattia

2
객체 지향 접근 방식을 사용할 때와 ax.set_frame_on(False)같은 성공을 거두었습니다 . 위의 답변에 포함될 수 있습니다.
Floyd4K

58

에 구축 peeol의 훌륭한 대답 @ , 당신은 또한 수행하여 프레임을 제거 할 수 있습니다

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

예제를 제공하기 위해 (이 포스트의 끝에서 전체 코드 샘플을 찾을 수 있습니다) 다음과 같은 막대 그림이 있다고 가정 해 보겠습니다.

여기에 이미지 설명을 입력하십시오

위의 명령으로 프레임을 제거한 다음 x-and 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()

1
내 문제가 해결되었습니다.
Emad Aghayi

6

여기 에 대답했듯이 스타일 설정 (스타일 시트 또는 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

6

문제

좌표축을 사용하는 것과 비슷한 문제가있었습니다. 클래스 매개 변수는 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()

5

나는 그렇게하기 위해 사용한다 :

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

2

차트의 프레임을 제거하려면

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

이것이 효과가 있기를 바랍니다.


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

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

트릭을해야합니다.


0
plt.axis('off')
plt.savefig(file_path, bbox_inches="tight", pad_inches = 0)

plt.savefig 자체에는 이러한 옵션이 있으므로 축을 끄기 전에 설정해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.