복붙노트

[PYTHON] Matplotlib fill_between가 plot_date와 호환되지 않습니다.

PYTHON

Matplotlib 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. ==============================

    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. ==============================

    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()
    
  3. from https://stackoverflow.com/questions/28091290/matplotlibs-fill-between-doesnt-work-with-plot-date-any-alternatives by cc-by-sa and MIT license