add_vline/hline annotation text location fixed to first shape if using a pre-instantiated dict for the "annotation" input parameter
Personne n'a encore pris cette issue.
- Langage dominant
- Python
- Étoiles
- 18.8k
- Forks
- 2.8k
- Merge moyen
- 16 h 26 min
- PR mergées (30 j)
- 21
Description
Hi
When I instantiate a dict once with some constant formatting that I want to pass to the "annotation" argument for several calls of .add_vline() (or .add_hline()), all annotations for shapes created with this dict are placed with the shape created by the initial .add_vline() call.
e.g.:
import plotly.graph_objects as go
fig = go.Figure()
y_1 = [3000, 3500, 4000, 3500, 3000, 3500]
x_1 = list(range(len(y_1)))
fig.add_trace(go.Scatter(x=x_1, y=y_1))
annotation = dict(font_color="#000000")
fig.add_vline(x=2, annotation_text="vline 1", annotation=annotation)
print(f"annotation after first .add_vline():\n{annotation}")
fig.add_vline(x=3, annotation_text="vline 2", annotation=annotation)
print(f"annotation after second .add_vline():\n{annotation}")
fig.write_html("graph.html")
produces graph and output (similar result if .add_hline() used instead) - expected graph can be seen at the end of this post:

annotation after first .add_vline():
{'font_color': '#000000', 'text': 'vline 1', 'xanchor': 'left', 'yanchor': 'top', 'x': 2, 'y': 1, 'showarrow': False}
annotation after second .add_vline():
{'font_color': '#000000', 'text': 'vline 2', 'xanchor': 'left', 'yanchor': 'top', 'x': 2, 'y': 1, 'showarrow': False}
Is this expected behaviour? As the x coordinate is explicitly given in the method I would expect that the annotation defined would be placed at that x, as happens with the different annotation_text values.
As we can see from the output, it is because the original annotation dictionary instance is being mutated in the process of adding the annotation. Then if an x value is present in the annotation dictionary, it is not overwritten, but the text value is if a new annotation_text value is passed.
Looking at the package code, I can achieve the behaviour I expected by implementing an else here:
https://github.com/plotly/plotly.py/blob/cfad7862594b35965c0e000813bd7805e8494a5b/packages/python/plotly/plotly/shapeannotation.py#L203-L204
Suggestion:
if annotation is None:
annotation = dict()
else:
annotation = annotation.copy()
I have made this change locally and run fine and as I expect.
If the current behaviour is not the expected behaviour, and if the suggested change above is acceptable, I would be glad to implement and test it appropriately then submit a pull request.
Cheers!
Graph I expect:

Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Commencez dans plotly/shapeannotation.py aux lignes 203-204 et reproduisez le problème avec des appels répétés à add_vline() en utilisant un seul dictionnaire d’annotation, puis comparez avec add_hline(). Le travail est considéré comme terminé lorsque le dictionnaire fourni n’est pas modifié et que l’annotation de chaque shape utilise sa propre coordonnée ; ajoutez ou mettez à jour les tests pour les deux méthodes, selon le cas.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- python
- Domaine
- data-visualization
- Type d'issue
- Bug
- Difficulté
- 2/5
- Temps estimé
- 1-3 heures
- Activité
- À l'abandon
- Clarté
- Clairement spécifiée
- Accessibilité débutants
- 45/100