2017-02-13 1 views
3

나는 그림의 크기를 조정하면서 팬더 데이터 프레임의 플롯 방법의 편리함을 이용하려고합니다. (필자는 Jupyter 노트북에 파일을 인라인으로 표시 할뿐만 아니라 파일을 저장하고 있습니다.) 같은 차트에 두 줄을 그릴 때를 제외하고는 대부분의 경우 아래의 방법으로 성공한 것으로 나타났습니다. 그런 다음 그림은 기본 크기로 돌아갑니다.팬더 플롯 방법을 사용하여 그림 크기를 설정할 때 불일치가 발생했습니다.

이것이 계통도의 플롯과 데이터 프레임의 플롯의 차이 때문일 것으로 생각됩니다.

설정 예제 코드 :

data = { 
    'A': 90 + np.random.randn(366), 
    'B': 85 + np.random.randn(366) 
} 

date_range = pd.date_range('2016-01-01', '2016-12-31') 

index = pd.Index(date_range, name='Date') 

df = pd.DataFrame(data=data, index=index) 

제어 -이 코드는 (넓은 플롯) 예상 결과를 생성 :

fig = plt.figure(figsize=(10,4)) 

df['A'].plot() 
plt.savefig("plot1.png") 
plt.show() 

결과 :

plot1.png

은 두 줄을 플로팅 - 그림 크기가 (10,4)

0이 아닙니다.
fig = plt.figure(figsize=(10,4)) 

df[['A', 'B']].plot() 
plt.savefig("plot2.png") 
plt.show() 

결과 :

plot2.png

그림 크기가 일관성없이 일련 번호의 설정 선택되도록이 작업을 수행하는 올바른 방법은 무엇입니까?

+1

나는 지금 좋은 해결책을 발견했다 : df [[A ','B ']]. plot (figsize = (10,4))'그러나 여전히, 나는 위의 방법 일치하지 않는 결과가 발생합니다. – Bill

+0

축과 그림을 생성하고 축을 'plot' 메쏘드에 전달해야합니다 : fig, ax = plt.subplots (figsize = (10,4)); df [[ 'A', 'B']]. plot (ax = ax)' –

답변

4

두 경우의 차이에 대한 이유는 pandas.DataFrame.plot()의 논리 내부에 숨겨진 비트입니다. the documentation에서 볼 수 있듯이이 메서드는 많은 종류의 다른 경우를 처리 할 수 ​​있도록 많은 인수를 전달할 수 있습니다.

첫 번째 경우 fig = plt.figure(figsize=(10,4))을 통해 matplotlib 그림을 만든 다음 단일 열 DataFrame을 플로트합니다. 이제 판다 플롯 기능의 내부 논리는 matplotlib 상태 머신에 이미 그림이 있는지 확인하고, 그렇다면 현재 축을 사용하여 열 값을 플로팅합니다. 이것은 예상대로 작동합니다.

그러나 두 번째 경우에는 데이터가 두 개의 열로 구성됩니다. 이러한 플롯을 처리하는 방법에는 여러 가지 옵션이 있습니다. 공유 또는 비공유 축과 함께 다른 하위 플롯을 사용하는 방법이 있습니다. 팬더가 가능한 요구 사항 중 하나를 적용 할 수있게하려면 기본적으로 새 그림을 만듭니다 플롯 할 축을 추가 할 수 있습니다. 새 수치는 이미 존재하는 그림과 그 크기에 대해 알지 못하며, figsize 인수를 지정하지 않으면 기본 크기를가집니다.

의견에서 가능한 해결책은 df[['A', 'B']].plot(figsize=(10,4))을 사용하는 것이라고 말합니다. 이것은 맞지만 초기 숫자의 생성은 생략해야합니다. 그렇지 않으면 아마도 바람직하지 않은 2 개의 그림이 생성됩니다. 노트북에서는 이것이 보이지 않을 것입니다. 그러나 이것을 보통 파이썬 스크립트 인 plt.show()으로 끝까지 실행하면 두 개의 그림 창이 열립니다.

그래서 팬더도 작성 처리하게 용액 새로운 그림의 생성을 회피하는 방법 ax가 외부에서 생성되는 pandas.DataFrame.plot(ax=ax) 함수에 ax 인수를 제공하는 것이다

import pandas as pd 
import matplotlib.pyplot as plt 

df = pd.DataFrame({"A":[2,3,1], "B":[1,2,2]}) 
df[['A', 'B']].plot(figsize=(10,4)) 

plt.show() 

인 축. 이 축은 plt.gca()을 통해 얻은 표준 축이 될 수 있습니다.

import pandas as pd 
import matplotlib.pyplot as plt 

df = pd.DataFrame({"A":[2,3,1], "B":[1,2,2]}) 
plt.figure(figsize=(10,4)) 
df[['A', 'B']].plot(ax = plt.gca()) 

plt.show() 

또는 answer from PaulH에 표시된 객체 지향 방식을 사용하십시오.

3

항상 FigureAxes 개체에서 명시 적으로 직접 작동하십시오. pyplot 상태 시스템에 의존하지 마십시오. 귀하의 경우에는 의미 :

fig1, ax1 = plt.subplots(figsize=(10,4)) 
df['A'].plot(ax=ax1) 
fig1.savefig("plot1.png") 


fig2, ax2 = plt.figure(figsize=(10,4)) 
df[['A', 'B']].plot(ax=ax2) 
fig2.savefig("plot2.png") 

plt.show() 
관련 문제