Tempo de plotagem em Python com Matplotlib

163

Eu tenho uma matriz de carimbos de data / hora no formato (HH: MM: SS.mmmmmm) e outra matriz de números de ponto flutuante, cada um correspondendo a um valor na matriz de carimbo de data / hora.

Posso plotar o tempo no eixo x e os números no eixo y usando o Matplotlib?

Eu estava tentando, mas de alguma forma estava aceitando apenas matrizes de carros alegóricos. Como posso fazer isso para traçar o tempo? Preciso modificar o formato de alguma forma?

pensamento aleatório
fonte

Respostas:

178

Você deve primeiro converter seus carimbos de data e hora em datetimeobjetos Python (use datetime.strptime). Em seguida, use date2numpara converter as datas no formato matplotlib.

Plote as datas e os valores usando plot_date:

dates = matplotlib.dates.date2num(list_of_datetimes)
matplotlib.pyplot.plot_date(dates, values)
codeape
fonte
2
plotará a data ou apenas a hora? Eu só quero o tempo desde quando da conversão em data e hora, o ano está definido para 1990.
randomThought
"... na conversão para data e hora, o ano está definido para 1990": você poderia postar o código que você usa para converter de seqüência de caracteres para data e hora? Algo pode estar errado com a conversão. Ré. a formatação dos rótulos dos gráficos, consulte o link date_demo1 fornecido por JK Seppänen. A documentação da lib do matplot é excelente, BTW. matplotlib.sourceforge.net/index.html
codeape 19/10/09
14
plot_dates -> matplotlib.pyplot.plot_date (datas, valores)
Pete
3
Que tal um gráfico de dispersão? Desejo fornecer uma matriz de tamanho para determinar o tamanho das bolhas de dispersão, mas não há equivalente scatter_date()e nenhuma maneira óbvia / direta de obter esse gráfico.
precisa saber é o seguinte
4
O exemplo acima retorna uma lista com um objeto do tipo: objeto matplotlib.lines.Line2D. Agora, como uso isso para mostrar o gráfico?
Arindam Roychowdhury
87

Você também pode plotar o timestamp, pares de valores usando pyplot.plot (depois de analisá- los a partir de suas representações de cadeias). (Testado com as versões 1.2.0 e 1.3.1 do matplotlib.)

Exemplo:

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()

Imagem resultante:

Gráfico de linha


Aqui está o mesmo que um gráfico de dispersão:

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()

Produz uma imagem semelhante a esta:

Gráfico de Dispersão

moooeeeep
fonte
4
@andi deve funcionar como no meu exemplo (mude plotpara scatter).
moooeeeep
1
Não entendo por que essa é a quinta pergunta que encontrei em que ninguém realmente tentou usar um gráfico de dispersão - não funciona. Type Error - invalid type promotion.
dwanderson
1
@dwanderson Então, talvez você esteja fazendo algo errado. Adicionei um exemplo para o gráfico de dispersão com datetime.datetimeobjetos no eixo x na minha postagem.
moooeeeep
Para o grid addplt.grid(True)
Christophe Roussy 30/11
1
@AimForClarity Funciona para mim com o matplotlib.__version__2.2.2. No entanto, o gráfico de dispersão possui alguns limites x excessivamente amplos definidos por padrão. Esta resposta parece fornecer uma solução que não seja ajustando manualmente plt.xlim(...): stackoverflow.com/a/46467896/1025391
moooeeeep
23

7 anos depois e esse código me ajudou. No entanto, meus horários ainda não estavam aparecendo corretamente.

insira a descrição da imagem aqui

Usando o Matplotlib 2.0.0 e eu tive que adicionar o seguinte bit de código em Editando a formatação de data dos rótulos de marcação do eixo x no matplotlib por Paul H.

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

Alterei o formato para (% H:% M) e a hora exibida corretamente. insira a descrição da imagem aqui

Tudo graças à comunidade.

GeorgeLPerkins
fonte
16

Eu tive problemas com isso usando a versão matplotlib: 2.0.2. Executando o exemplo acima, recebi um conjunto centralizado de bolhas empilhadas.

gráfico com pilha centralizada de bolhas

Corrigi o problema adicionando outra linha:

plt.plot([],[])

Todo o snippet de código se torna:

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()

Isso produz uma imagem com as bolhas distribuídas conforme desejado.

gráfico com bolhas distribuídas ao longo do tempo

Kirk
fonte
Não funciona em py2.6 para mim. Recebo ValueError: o limite de exibição mínimo -0,05500000000000001 é menor que 1 e é um valor de data inválido do Matplotlib. Isso geralmente acontece se você passar um não-datetime valor a um eixo que tem data e hora unidades <Figura tamanho 432x288 com 1 Eixos>
AimForClarity
Uma solução para os estranhos x-lims é defini-los por conta própria: stackoverflow.com/questions/21423158/…
Qaswed