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


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


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


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.



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='-')

1

Apenas para linhas horizontais

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

Funcionou

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.