IT story

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

hot-time 2020. 7. 12. 09:30
반응형

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


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

frameon=False

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

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


먼저 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')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([])

에 구축 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()

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

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

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

from pylab import *
axes(frameon = 0)
...
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')

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

문제

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

참고 URL : https://stackoverflow.com/questions/14908576/how-to-remove-frame-from-matplotlib-pyplot-figure-vs-matplotlib-figure-frame

반응형