[PYTHON] Matplotlib fill_between가 plot_date와 호환되지 않습니다.
PYTHONMatplotlib fill_between가 plot_date와 호환되지 않습니다.
나는 다음과 같이 플롯을 만들고 싶다 :
코드:
P.fill_between(DF.start.index, DF.lwr, DF.upr, facecolor='blue', alpha=.2)
P.plot(DF.start.index, DF.Rt, '.')
하지만 x 축에 날짜가있는 경우 (밴드 제외) :
코드:
P.plot_date(DF.start, DF.Rt, '.')
문제는 x 값이 date_time 객체 일 때 fill_between가 실패한다는 것입니다.
누구든지 해결 방법을 알고 있습니까? DF는 판다 데이터 프레임입니다.
해결법
-
==============================
1.df 정의 방법을 보여 주면 도움이 될 것입니다. df.info ()는 무엇을보고합니까? 그러면 열의 유형이 표시됩니다.
df 정의 방법을 보여 주면 도움이 될 것입니다. df.info ()는 무엇을보고합니까? 그러면 열의 유형이 표시됩니다.
문자열, 정수, 부동 소수점, datetime.datetime, NumPy datetime64s, Pandas Timestamps 또는 Pandas DatetimeIndex와 같이 날짜를 표현할 수있는 방법은 다양합니다. 음모를 꾸미는 올바른 방법은 가지고있는 것에 달려 있습니다.
다음은 df.index가 DatetimeIndex 인 경우 코드 작동을 보여주는 예제입니다.
import numpy as np import pandas as pd import matplotlib.pyplot as plt from scipy import stats index = pd.date_range(start='2000-1-1', end='2015-1-1', freq='M') N = len(index) poisson = (stats.poisson.rvs(1000, size=(N,3))/100.0) poisson.sort(axis=1) df = pd.DataFrame(poisson, columns=['lwr', 'Rt', 'upr'], index=index) plt.fill_between(df.index, df.lwr, df.upr, facecolor='blue', alpha=.2) plt.plot(df.index, df.Rt, '.') plt.show()
인덱스에 날짜의 문자열 표현이 있으면 Matplotlib 버전 1.4.2를 사용하면 TypeError가 발생합니다.
import numpy as np import pandas as pd import matplotlib.pyplot as plt from scipy import stats index = pd.date_range(start='2000-1-1', end='2015-1-1', freq='M') N = len(index) poisson = (stats.poisson.rvs(1000, size=(N,3))/100.0) poisson.sort(axis=1) df = pd.DataFrame(poisson, columns=['lwr', 'Rt', 'upr']) index = [item.strftime('%Y-%m-%d') for item in index] plt.fill_between(index, df.lwr, df.upr, facecolor='blue', alpha=.2) plt.plot(index, df.Rt, '.') plt.show()
산출량
File "/home/unutbu/.virtualenvs/dev/local/lib/python2.7/site-packages/numpy/ma/core.py", line 2237, in masked_invalid condition = ~(np.isfinite(a)) TypeError: Not implemented for this type
이 경우 문자열을 타임 스탬프로 변환해야합니다.
index = pd.to_datetime(index)
-
==============================
2.chilliq에 의해보고 된 오류에 관해서 :
chilliq에 의해보고 된 오류에 관해서 :
TypeError: ufunc 'isfinite' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''
이것은 fill_between를 사용할 때 DataFrame 열에 "object"dtype이 있으면 생성 될 수 있습니다. 예제 열의 유형을 변경하고 다음과 같이 플롯하려고하면 위의 오류가 발생합니다.
import numpy as np import pandas as pd import matplotlib.pyplot as plt from scipy import stats index = pd.date_range(start='2000-1-1', end='2015-1-1', freq='M') N = len(index) poisson = (stats.poisson.rvs(1000, size=(N,3))/100.0) poisson.sort(axis=1) df = pd.DataFrame(poisson, columns=['lwr', 'Rt', 'upr'], index=index) dfo = df.astype(object) plt.fill_between(df0.index, df0.lwr, df0.upr, facecolor='blue', alpha=.2) plt.show()
dfo.info ()에서 열 유형이 "object"임을 알 수 있습니다.
<class 'pandas.core.frame.DataFrame'> DatetimeIndex: 180 entries, 2000-01-31 to 2014-12-31 Freq: M Data columns (total 3 columns): lwr 180 non-null object Rt 180 non-null object upr 180 non-null object dtypes: object(3) memory usage: 5.6+ KB
DataFrame에 숫자 열이 있는지 확인하여 문제를 해결할 수 있습니다. 이를 위해 다음과 같이 pandas.to_numeric을 사용하여 변환 할 수 있습니다.
dfn = dfo.apply(pd.to_numeric, errors='ignore') plt.fill_between(dfn.index, dfn.lwr, dfn.upr, facecolor='blue', alpha=.2) plt.show()
from https://stackoverflow.com/questions/28091290/matplotlibs-fill-between-doesnt-work-with-plot-date-any-alternatives by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] sns.countplot에서 중복되는 x 축 레이블을 방지하는 방법 (0) | 2018.11.17 |
---|---|
[PYTHON] 파이썬을 사용하여 타겟에서 총알 구멍을 탐지하는 법 (0) | 2018.11.17 |
[PYTHON] 팬더 DataFrame을 주황색 테이블로 변환 (0) | 2018.11.17 |
[PYTHON] 빠른 문자열 배열 - Cython (0) | 2018.11.17 |
[PYTHON] 영구적 인 파이썬 하위 프로세스 (0) | 2018.11.17 |