Sou bastante novo em python / matplotlib e em usá-lo por meio do notebook ipython. Estou tentando adicionar algumas linhas de anotação a um gráfico existente e não consigo descobrir como renderizar as linhas em um gráfico. Então, por exemplo, se eu plotar o seguinte:
import numpy as np
np.random.seed(5)
x = arange(1, 101)
y = 20 + 3 * x + np.random.normal(0, 60, 100)
p = plot(x, y, "o")
Eu obtenho o seguinte gráfico:
Então, como eu adicionaria uma linha vertical de (70.100) até (70.250)? Que tal uma linha diagonal de (70.100) a (90.200)?
Tentei algumas coisas que Line2D()
resultaram em nada além de confusão da minha parte. Em R
eu simplesmente usaria a função segmentos () que adicionaria segmentos de linha. Existe um equivalente em matplotlib
?
fonte
x = np.arange(1, 101)
.plt.plot([70, 70], [100, 250], 'k-', lw=2, label="_not in legend")
90
ser usado comox2
e ey1
leva a muita ambigüidade. Para quem está vendo isso, observe que[70, 90]
não se refere a um único ponto no localx1,y1
. Para referência, aqui estão os significados dos valores:[x1: 70, x2: 90], [y1: 90, y2: 200]
Não é tarde demais para os recém - chegados .
Ele também leva o intervalo de y, usando ymin e ymax.
fonte
Usando
vlines
:As assinaturas de chamada básicas são:
fonte
vline()
ouhline()
. E quanto às linhas diagonais? Editei a pergunta para adicionar a parte diagonal, agora que você me mostrou as linhas h e v.DataFrame
contendo as coordenadas x, y e plotá-los comstyle='k-'
Matplolib agora permite 'linhas de anotação' como o OP estava procurando. A
annotate()
função permite várias formas de conectar caminhos e uma seta sem cabeça e sem cauda, ou seja, uma linha simples, é uma delas.Na documentação , diz que você pode desenhar apenas uma seta com uma string vazia como o primeiro argumento.
Do exemplo do OP:
Assim como na abordagem da resposta de gcalmettes, você pode escolher a cor, largura da linha, estilo da linha, etc.
Aqui está uma alteração em uma parte do código que tornaria uma das duas linhas de exemplo vermelha, mais larga e não 100% opaca.
Você também pode adicionar curva à linha de conexão ajustando o
connectionstyle
.fonte
.plot()
não posso fazer.Em vez de abusar de
plot
ouannotate
, que será ineficiente para muitas linhas, você pode usarmatplotlib.collections.LineCollection
:Leva uma lista de linhas
[l1, l2, ...]
, onde cada linha é uma sequência de N coordenadas ( N pode ser mais de duas).As palavras-chave de formatação padrão estão disponíveis, aceitando um único valor, caso em que o valor se aplica a todas as linhas, ou uma sequência de M
values
, caso em que o valor da i- ésima linha évalues[i % M]
.fonte