繁体   English   中英

如何在seaborn lineplot上绘制虚线?

[英]How to plot a dashed line on seaborn lineplot?

我只是想用seaborn绘制一条虚线。 这是我正在使用的代码和我得到的输出

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()

在此处输入图片说明

我究竟做错了什么? 谢谢

似乎lineplot() linestyle=参数不适用于lineplot() ,并且参数dashes=比看起来要复杂一些。

一种(相对)简单的方法可能是使用ax.lines获取绘图上 Line2D 对象的列表,然后手动设置ax.lines

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()

在此处输入图片说明

更新:

看来dashes参数仅在绘制多条线时适用(通常使用熊猫数据框)。 破折号的指定与 matplotlib 中的相同,这是一个(段,间隙)长度的元组。 因此,您需要传递一个元组列表。

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()

在此处输入图片说明

正如之前提到的,seaborn 的 lineplot 覆盖了基于style变量的线型,根据文档,它可以是“数据或矢量数据中的变量名称”。 请注意将向量直接传递给style参数的第二个选项。 这允许使用以下简单的技巧来绘制虚线,即使只绘制单条线,无论是直接提供数据还是作为数据框:

如果我们提供一个常量样式向量,比如style=True ,它将被广播到所有数据。 现在我们只需要将dashes设置为所需的破折号元组(遗憾的是,不支持“简单”破折号说明符,例如“--”、“:”或“dotted”),例如dashes=[(2,2)]

import seaborn as sns
import numpy as np
x = np.linspace(0, np.pi, 111)
y = np.sin(x)
sns.lineplot(x, y, style=True, dashes=[(2,2)])

带破折号的简单线图

实际上,您以错误的方式使用lineplot 您的简化案例比seaborn任何内容都更适合matplotlibplot函数。 seaborn更在脚本使曲线更易读用更少的直接干预,一般得到最多的里程与打交道时pandas dataframes

例如

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()

产量

在此处输入图片说明

至于如何以您想要的方式为您尝试显示的变量设置样式,我不确定如何处理。

在当前版本的 seaborn 0.11.1 中,您的代码运行良好。

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=x,y=y, linestyle='--')
plt.show();

在此处输入图片说明

虽然其他答案有效,但它们需要更多的手工。


您可以将您的 seaborn 图包装在rc_context

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)

with plt.rc_context({'lines.linestyle': '--'}):
    sns.lineplot(x, y)
plt.show()

这导致了下图。

绘图结果

如果您想查看有关线路的其他选项,请使用以下行查看。

[k for k in plt.rcParams.keys() if k.startswith('lines')]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM