matpplotlib로 Nan의 데이터를 무시하고 선으로 연결

9773 단어 matplotlib

플로팅하려는 NaN이 포함된 CSV 데이터



아래와 같이 부등 간격의 시간 마다의 데이터가 들어간 CSV 파일의 데이터를 플롯 하고 싶다고 합니다.
bar1에서 bar4가 데이터. 중간에 누락이 있습니다.


time
data1
data2
data3
data4


0
449
449
445
440

510.1

445
442

530.1
420



730.1

410


1430.1
412
425
424
421


이것을 그대로 플롯하면 빈 부분에서 matplotlib의 선이 끊어져 부티부티의 그래프가 됩니다.
직선으로 연결되도록 했다는 이야기입니다.

그대로 데이터 프레임으로 플롯 해 보자.


import pandas as pd
df = pd.read_csv("data.csv")
print(df)

아무 생각없이 read_csv로 데이터 프레임에 넣으면 빈 부분이 NaN이됩니다.



시간
data1
data2
data3
data4


0
0.0
449.0
449.0
445.0
440.0

1
510.1
NaN
NaN
445.0
442.0

2
530.1
420.0
NaN
NaN
NaN

3
730.1
NaN
410.0
NaN
NaN

4
1430.1
412.0
425.0
424.0
421.0

import matplotlib.pyplot as plt
markers1 = ["d", "o", "v", "^", "<", ">", "1", "2", "3", 
            "4", "8", "s", "p", "*", "h", "H",  "x", "D", "|", ","]
fig0 = plt.figure(figsize=(8.2,8))
ax = fig0.add_subplot(111)

ax.set_ylim(390,450)

for i in range(4):
    ax.plot(df["time"], df["data"+str(i+1)], marker=markers1[i], label="data"+str(i+1))
ax.legend(bbox_to_anchor=(1.01, 1., 0., 0), loc='upper left', borderaxespad=0.,)

matplotlib로 플롯하면 선이 끊어져 표시됩니다. 모두 연결하고 싶다.


어떻게 할까?



플로팅 단계에서 NaN을 dropna로 제거한 다음 플롯합니다. "time"열의 데이터는 모두 채워져 있어, dropna로 사라지지 않으므로, 미리 index로 해 둡니다.
df = pd.read_csv("data.csv",index_col=0)

fig0 = plt.figure(figsize=(8.2,8))
ax = fig0.add_subplot(111)

ax.set_ylim(390,450)

for i in range(4):
    ax.plot(df["bar"+str(i+1)].dropna(how='any'), marker=markers1[i], label="data"+str(i+1))

ax.legend(bbox_to_anchor=(1.01, 1., 0., 0), loc='upper left', borderaxespad=0.,)

연결되었습니다.



보충


  • 덧붙여서 gnuplot로 했을 때, 최초의 CSV를 플롯한 것만으로, 그대로 전부 연결해 주었습니다.
  • 데이터 프레임의 interpolate로 하면(자), NaN는 무시해 보간해 줍니다만, time열의 데이터 간격을 반영해 보간하는 것은 하지 않기 때문에, 이번의 경우는 적용할 수 없습니다.
  • print(pd.read_csv("data.csv").interpolate())
    



    시간
    data1
    data2
    data3
    data4


    0
    0.0
    449.0
    449.0
    445.0
    440.0

    1
    510.1
    434.5
    436.0
    445.0
    442.0

    2
    530.1
    420.0
    423.0
    438.0
    435.0

    3
    730.1
    416.0
    410.0
    431.0
    428.0

    4
    1430.1
    412.0
    425.0
    424.0
    421.0


    data1의 510.1을 보면 여기는 원래 NaN이었지만 449와 420의 평균값 434.5입니다. 이 경우 0, 510.1, 530.1의 간격을 고려하여 보간해야합니다.

    gnuplot 가장 강하다는 것을 알았을 뿐 아니라 하지 않아도 없다. . .

    좋은 웹페이지 즐겨찾기