Python:在Seaborn中更改标记类型

时间:2017-07-14 23:37:34

标签: python matplotlib graph seaborn

在常规matplotlib中,您可以为绘图指定各种标记样式。但是,如果我导入seaborn,'+'和'x'样式停止工作并导致图表不显示 - 其他标记类型,例如'o','v'和'*'工作。

简单示例:

import matplotlib.pyplot as plt
import seaborn as sns

x_cross = [768]
y_cross = [1.028e8]
plt.plot(x_cross, y_cross, 'ok')

plt.gca().set_xlim([10, 1e4])
plt.gca().set_ylim([1, 1e18])
plt.xscale('log')
plt.yscale('log')

plt.show()

制作:Simple Seaborn Plot

将第6行的'ok'更改为'+ k'但是,不再显示绘制的点。如果我不导入seaborn,则可以按原样运行:Regular Plot With Cross Marker

有人可以告诉我在使用seaborn时如何将标记样式更改为交叉类型吗?

2 个答案:

答案 0 :(得分:4)

此行为的原因是seaborn将标记边缘宽度设置为零。 (见source)。

正如seaborn known issues

所指出的那样
  

matplotlib标记样式如何工作的一个令人遗憾的结果是,当默认的seaborn样式时,线条艺术标记(例如"+")或facecolor设置为"none"的标记将是不可见的是生效的。这可以通过在函数调用中使用不同的markeredgewidth(别名为mew)来更改,也可以在rcParams中使用全局更改。

This issue正在告诉我们这个问题以及this one

在这种情况下,解决方案是将市场宽度设置为大于零的值,

  • 使用rcParams(导入seaborn后):

    plt.rcParams["lines.markeredgewidth"] = 1
    
  • 使用markeredgewidthmew关键字参数

    plt.plot(..., mew=1)
    

然而,正如@mwaskom在评论中指出的那样,实际上还有更多内容。在this issue中,有人认为标记应该分为两类,批量样式标记和线条艺术标记。这已在matplotlib 2.0版中部分完成,您可以在其中获得" plus"作为标记,使用marker="P"即使markeredgewidth=0也可以看到此标记。

plt.plot(x_cross, y_cross, 'kP')

enter image description here

答案 1 :(得分:2)

非常喜欢成为一个错误。但是,您可以使用mew关键字设置标记边线宽,以获得所需内容:

import matplotlib.pyplot as plt
import seaborn as sns

x_cross = [768]
y_cross = [1.028e8]

# set marker edge line width to 0.5
plt.plot(x_cross, y_cross, '+k', mew=.5)

plt.gca().set_xlim([10, 1e4])
plt.gca().set_ylim([1, 1e18])
plt.xscale('log')
plt.yscale('log')

plt.show()

enter image description here