Fazendo com que as linhas de grade verticais apareçam no gráfico de linhas em matplotlib

93

Desejo obter linhas de grade horizontais e verticais em meu gráfico, mas apenas as linhas de grade horizontais aparecem por padrão. Estou usando uma pandas.DataFrameconsulta sql em python para gerar um gráfico de linha com datas no eixo x. Não sei por que eles não aparecem nas datas e tentei pesquisar uma resposta, mas não consegui encontrar.

Tudo o que usei para traçar o gráfico é o código simples abaixo.

data.plot()
grid('on')

data é o DataFrame que contém as datas e os dados da consulta sql.

Também tentei adicionar o código abaixo, mas ainda obtenho a mesma saída sem linhas de grade verticais.

ax = plt.axes()        
ax.yaxis.grid() # horizontal lines
ax.xaxis.grid() # vertical lines

Alguma sugestão?

insira a descrição da imagem aqui

Osmond Bishop
fonte
data.plot(grid="on")trabalhou para mim
Markus

Respostas:

101

Você pode precisar fornecer arg booleano em suas chamadas, por exemplo, use em ax.yaxis.grid(True)vez de ax.yaxis.grid(). Além disso, como você está usando os dois, pode combinar em ax.grid, o que funciona em ambos, em vez de fazer isso uma vez para cada dimensão.

ax = plt.gca()
ax.grid(True)

Isso deve resolver você.

wim
fonte
Eu tentei, mas por algum motivo ainda parece o mesmo de antes
Osmond Bishop
1
Você está fazendo isso no intérprete interativo? Certifique-se de configurar a grade antes de ligarplt.show()
wim
Estou usando o iPython. Tentei adicionar plt.show () e não fará diferença.
Osmond Bishop
1
Bem, isso é estranho. Qual é a sua versão do ipython, também tente executá-lo como ipython --pylab, e faça plt.grid(True)imediatamente - você vê a grade?
wim
Eu tentei plt.grid(True)e consegui o gráfico vazio com as linhas de grade verticais e horizontais, então sim, é estranho porque eu não consigo fazer isso para meu gráfico de linha. Estou executando a última versão disponível do iPython.
Osmond Bishop
57

plt.gca().xaxis.grid(True) provou ser a solução para mim

mate
fonte
6
O myaxes.grid(which='x')não estava funcionando para mim com o matplotlib versão 1.4.2 ... não conseguia fazer a whichpalavra-chave funcionar. No entanto, myaxes.xaxis.grid(True)fez o truque e é IMO conceitualmente melhor. Ah, e não se esqueça do myaxes.set_axisbelow(True)método útil de colocar a grade por trás dos dados.
travc
25

De acordo com a documentação matplotlib , a assinatura do método de Axesclasse grid()é a seguinte:

Axes.grid (b = None, which = 'major', axis = 'both', ** kwargs)
Ligue ou desligue as grades dos eixos.

which pode ser 'principal' (padrão), 'secundária' ou 'ambos' para controlar se as grades principais, as grades secundárias ou ambas são afetadas.

axis pode ser 'both' (padrão), 'x' ou 'y' para controlar qual conjunto de linhas de grade é desenhado.

Portanto, para mostrar as linhas de grade para os eixos xey, podemos usar o seguinte código:

ax = plt.gca()
ax.grid(which='major', axis='both', linestyle='--')

Este método nos dá um controle mais preciso sobre o que mostrar nas linhas de grade.

jdhao
fonte
6

talvez isso possa resolver o problema: matplotlib, defina o tamanho de uma grade em um gráfico

ax.grid(True, which='both')

A verdade é que a grade está funcionando, mas há apenas uma grade v às 00h00 e nenhuma grade nas outras. Eu encontro o mesmo problema de que há apenas uma grade em 1 de novembro entre muitos dias.

Lory_yang
fonte
3

Resposta curta (leia abaixo para mais informações):

ax.grid(axis='both', which='both')

insira a descrição da imagem aqui

O que você faz é correto e deve funcionar.

No entanto, como o eixo X em seu exemplo é um eixo DateTime, as marcas de escala principais (mais provavelmente) estão aparecendo apenas nas duas extremidades do eixo X. Os outros tick-marcas visíveis são menores tick-marcas.

O ax.grid()método, por padrão, desenha linhas de grade nas marcas de escala principais. Portanto, nada aparece em seu enredo.

Use o código abaixo para destacar as marcas. Os maiores serão azuis enquanto os menores serão vermelhos.

ax.tick_params(which='both', width=3)
ax.tick_params(which='major', length=20, color='b')
ax.tick_params(which='minor', length=10, color='r')

Agora, para forçar as linhas de grade a aparecerem também nas marcas de verificação secundárias, passe o which='minor'para o método:

ax.grid(b=True, which='minor', axis='x', color='#000000', linestyle='--')

ou simplesmente use which='both'para desenhar linhas de grade principais e secundárias. E esta é uma linha de grade mais elegante:

ax.grid(b=True, which='minor', axis='both', color='#888888', linestyle='--')
ax.grid(b=True, which='major', axis='both', color='#000000', linestyle='-')
Sombrio
fonte
1

Apenas para linhas horizontais

ax = plt.axes()        
ax.yaxis.grid() # horizontal lines

Funcionou

Mudit
fonte