2017-07-14 59 views
3

在常规matplotlib中,您可以指定各种标记样式。但是,如果我导入seaborn,“+”和“x”样式停止工作并导致图块不显示 - 其他标记类型,例如'o','v'和'*'起作用。Python:更改Seaborn中的标记类型

简单的例子:

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

更改 'OK' 第6行至然而 '+ K',不再示出了绘制的点。如果我不导入seaborn它的作品,因为它应该:Regular Plot With Cross Marker

可能有人请赐教,我怎么更改标记样式的十字型使用seaborn什么时候?

回答

4

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

正如指出的seaborn known issues

的matplotlib标记样式的工作方式是,艺术线条标记(例如"+")或facecolor设置为"none"标记的不幸后果将是不可见的时候默认seaborn风格是有效的。这可以通过在函数调用中使用不同的markeredgewidth(别名为mew)或在rcParams中全局使用。

This issue告诉我们关于它以及this one

在这种情况下,该解决方案是将markeredgewidth设置的东西大于零,

  • 使用rcParams(导入seaborn后):使用markeredgewidthmew关键字

    plt.rcParams["lines.markeredgewidth"] = 1 
    
  • 论点

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

不过,正如@mwaskom在评论中指出的那样,实际上还有更多。在this issue中有人认为,标记应该分为两类,散装样式标记和线条标记。这在matplotlib 2.0版本中已经部分完成,您可以使用marker="P"获得“plus”作为标记,即使使用markeredgewidth=0,该标记也将可见。

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

enter image description here

+0

啊;我想我应该总是在将来首先检查“已知问题”。感谢您扩展以前的答案。 –

+1

你链接到的两个问题实际上是一个类似但独立的问题,它是matplotlib 1.4.2中的一个错误。最相关的问题是在matplotlib github这里:https://github.com/matplotlib/matplotlib/issues/4679。这在matplotlib 2中通过添加线性标记的“填充”版本来处理,例如,不管线宽设置如何,“P”会画出一个加号。 – mwaskom

2

它非常想成为一个bug。然而,你可以通过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

+0

这是完美的。非常感谢。 –