Matplotlib을 사용하여 Python에서 시간 플로팅


164

형식 (HH : MM : SS.mmmmmm)의 타임 스탬프 배열과 부동 소수점 숫자의 배열이 각각 타임 스탬프 배열의 값에 해당합니다.

Matplotlib을 사용하여 x 축에 시간과 y 축에 숫자를 그릴 수 있습니까?

나는 노력하고 있었지만 어떻게 든 그것은 수레의 배열 만 받아 들였다. 시간을 표시하려면 어떻게해야합니까? 어떤 식 으로든 형식을 수정해야합니까?

답변:


178

먼저 타임 스탬프를 Python datetime객체 로 변환해야 합니다 (use datetime.strptime). 그런 다음 date2num날짜를 matplotlib 형식으로 변환하는 데 사용 하십시오.

다음을 사용하여 날짜와 값을 플로팅하십시오 plot_date.

dates = matplotlib.dates.date2num(list_of_datetimes)
matplotlib.pyplot.plot_date(dates, values)

3
날짜 또는 시간 만 표시합니까? datetime으로 변환 한 이후로만 시간을 원합니다. 연도는 1990 년으로 설정되어 있습니다.
randomThought

"... 날짜 / 시간으로 변환시 연도가 1990으로 설정 됨": 문자열에서 날짜 / 시간으로 변환하는 데 사용하는 코드를 게시 할 수 있습니까? 변환에 문제가있을 수 있습니다. 레. 차트 레이블의 형식은 JK Seppänen에서 제공 한 date_demo1 링크를 참조하십시오. matplot lib 문서는 훌륭합니다 (BTW). matplotlib.sourceforge.net/index.html
codeape

14
plot_dates-> matplotlib.pyplot.plot_date (날짜, 값)
Pete

3
산점도는 어떻습니까? 분산 거품의 크기를 결정하기 위해 크기 배열을 제공하고 싶지만 scatter_date()이 그래프를 얻는 동등한 / 직접적인 방법 은 없습니다 .
dwanderson

4
위의 유형은 matplotlib.lines.Line2D 객체 유형의 객체가있는 목록을 반환합니다. 이제 이것을 사용하여 그래프를 표시합니까?
Arindam Roychowdhury

87

pyplot.plot을 사용하여 타임 스탬프, 값 쌍을 플롯 할 수도 있습니다 (문자열 표현에서 파싱 한 후). (matplotlib 버전 1.2.0 및 1.3.1로 테스트되었습니다.)

예:

import datetime
import random
import matplotlib.pyplot as plt

# make up some data
x = [datetime.datetime.now() + datetime.timedelta(hours=i) for i in range(12)]
y = [i+random.gauss(0,1) for i,_ in enumerate(x)]

# plot
plt.plot(x,y)
# beautify the x-labels
plt.gcf().autofmt_xdate()

plt.show()

결과 이미지 :

선 그림


다음은 산점도와 동일합니다.

import datetime
import random
import matplotlib.pyplot as plt

# make up some data
x = [datetime.datetime.now() + datetime.timedelta(hours=i) for i in range(12)]
y = [i+random.gauss(0,1) for i,_ in enumerate(x)]

# plot
plt.scatter(x,y)
# beautify the x-labels
plt.gcf().autofmt_xdate()

plt.show()

다음과 유사한 이미지를 생성합니다.

산포도


4
@andi는 (변경 내 예와 같이 그냥 작동해야 plot하는 scatter).
moooeeeep

1
아무도 이것이 실제로 산점도를 사용하여 시도한 적이없는 5 번째 질문 인 이유를 이해 하지 못합니다. 작동하지 않습니다. Type Error - invalid type promotion.
dwanderson

1
@dwanderson 그렇다면, 당신은 뭔가 잘못하고있을 것입니다. datetime.datetimex 축에 객체가 있는 산점도의 예를 게시물에 추가했습니다.
moooeeeep

그리드 추가의 경우plt.grid(True)
크리스토프 후씨

1
@AimForClarity는 matplotlib.__version__2.2.2에서 작동합니다 . 그러나 산점도에는 기본적으로 지나치게 넓은 x- 한계가 설정되어 있습니다. 이 답변은 수동 조정 이외의 해결 방법을 제공하는 것 같습니다 plt.xlim(...): stackoverflow.com/a/46467896/1025391
moooeeeep

23

7 년 후이 코드가 도움이되었습니다. 그러나 내 시간은 여전히 ​​올바르게 나타나지 않았습니다.

여기에 이미지 설명을 입력하십시오

Matplotlib 2.0.0을 사용하면 Paul H의 matplotlib에서 x 축 눈금 레이블의 날짜 형식 편집 에서 다음 코드를 추가해야했습니다 .

import matplotlib.dates as mdates
myFmt = mdates.DateFormatter('%d')
ax.xaxis.set_major_formatter(myFmt)

형식을 (% H : % M)으로 변경하고 시간이 올바르게 표시되었습니다. 여기에 이미지 설명을 입력하십시오

커뮤니티 덕분입니다.


16

matplotlib 버전 2.0.2를 사용 하여이 문제가 발생했습니다. 위에서 예제를 실행하면 중앙에 쌓인 거품 세트가 있습니다.

거품의 중심 스택 그래프

다른 줄을 추가하여 문제를 "수정"했습니다.

plt.plot([],[])

전체 코드 스 니펫은 다음과 같습니다.

import datetime
import random
import matplotlib.pyplot as plt
import matplotlib.dates as mdates


# make up some data
x = [datetime.datetime.now() + datetime.timedelta(minutes=i) for i in range(12)]
y = [i+random.gauss(0,1) for i,_ in enumerate(x)]

# plot
plt.plot([],[])
plt.scatter(x,y)

# beautify the x-labels
plt.gcf().autofmt_xdate()
myFmt = mdates.DateFormatter('%H:%M')
plt.gca().xaxis.set_major_formatter(myFmt)

plt.show()
plt.close()

이는 기포가 원하는대로 분포 된 이미지를 생성합니다.

기포가 시간에 따라 분포 된 그래프


나를 위해 py2.6에서 작동하지 않습니다. ValueError : view limit minimum -0.05500000000000001이 1보다 작고 잘못된 Matplotlib 날짜 값입니다. 당신이 <1 개 축과 그림 크기 432x288> 날짜 단위가 축에 비 날짜 값을 전달할 경우에 자주 발생합니다
AimForClarity

이상한 x-lims에 대한 해결책은 스스로 설정하는 것입니다 : stackoverflow.com/questions/21423158/…
Qaswed
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.