web-dev-qa-db-fra.com

Comment tracer une ligne en pointillé sur le tracé de la ligne Seaborn?

J'essaie simplement de tracer une ligne en pointillé avec Seaborn. Ceci est le code que j'utilise et la sortie que je reçois

import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt

n = 11
x = np.linspace(0,2,n)
y = np.sin(2*np.pi*x)

sns.lineplot(x,y, linestyle='--')
plt.show()

 enter image description here

Qu'est-ce que je fais mal? Merci

3
crash

Il semble que l'argument linestyle= ne fonctionne pas avec lineplot(), et l'argument dashes= est un peu plus compliqué qu'il n'y paraît.

Une façon (relativement) simple de procéder consiste à obtenir une liste des objets Line2D sur le tracé à l'aide de ax.lines, puis à définir le style de trait manuellement:

import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt

n = 11
x = np.linspace(0,2,n)
y = np.sin(2*np.pi*x)

ax = sns.lineplot(x,y)

# Might need to loop through the list if there are multiple lines on the plot
ax.lines[0].set_linestyle("--")

plt.show()

 enter image description here

Mettre à jour:

Il semble que l'argument dashes s'applique uniquement lors du traçage de plusieurs lignes (généralement à l'aide d'un cadre de données pandas). Les tirets sont spécifiés comme dans matplotlib, un tuple de longueurs (segment, gap). Par conséquent, vous devez passer une liste de tuples.

n = 100
x = np.linspace(0,4,n)
y1 = np.sin(2*np.pi*x)
y2 = np.cos(2*np.pi*x)

df = pd.DataFrame(np.c_[y1, y2]) # modified @Elliots dataframe production

ax = sns.lineplot(data=df, dashes=[(2, 2), (2, 2)])
plt.show()

 enter image description here

5
DavidG

En fait, vous utilisez lineplot dans le mauvais sens. Votre cas simplifié est plus approprié pour la fonction matplotlib de plot que pour tout ce qui vient de seaborn. seaborn est plus destiné à rendre les parcelles plus lisibles avec une intervention moins directe dans le script, et obtient généralement le plus de kilométrage pour traiter les pandas dataframes

Par exemple

import seaborn as sns
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

n = 100
x = np.linspace(0,2,n)
y1 = np.sin(2*np.pi*x)
y2 = np.sin(4*np.pi*x)
y3 = np.sin(6*np.pi*x)

df = pd.DataFrame(np.c_[y1, y2, y3], index=x)

ax = sns.lineplot(data=df)
plt.show()

les rendements

 enter image description here

Pour ce qui est de définir les styles comme vous le souhaitez pour les variables que vous essayez de montrer, je ne sais pas trop comment les gérer.

0
Elliot