2017-07-14 2 views
3

In der normalen Matplotlib können Sie verschiedene Markierungsstile für Plots angeben. Wenn ich jedoch seaborn importiere, funktionieren die Stile "+" und "x" nicht mehr und die Plots werden nicht angezeigt - andere Markertypen, z. 'o', 'v' und '*' funktionieren.Python: Ändern des Markierungstyps in Seaborn

Einfaches Beispiel:

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

Dies erzeugt: Simple Seaborn Plot

Ändern 'ok' in Zeile 6 bis '+ k' jedoch nicht mehr zeigt den aufgetragenen Punkt. Wenn ich nicht seaborn importiere es funktioniert, wie es sollte: Regular Plot With Cross Marker

Könnte jemand bitte erleuchte mich, wie ich den Marker Stil zu einem Kreuztyp ändern, wenn seaborn verwendet?

Antwort

4

Der Grund für dieses Verhalten ist, dass Seaborn die Markierung Kantenbreite auf Null setzt. (siehe source).

Wie in den seaborn known issues

wies darauf hin,

Eine unglückliche Folge, wie die matplotlib Marker Stile Arbeit ist, dass Line-Kunst-Marker (zB "+") oder Marker mit facecolor Satz "none" unsichtbar sein wird, wenn der Standard Seaborn-Stil ist in Kraft. Dies kann mit einem anderen markeredgewidth (aliased zu mew) entweder im Funktionsaufruf oder global in den rcParams geändert werden.

This issue erzählt uns davon ebenso wie this one.

In diesem Fall ist die Lösung der markeredgewidth etwas größer als Null ist,

  • rcParams einzustellen Verwendung (nach Seaborn Import):

    plt.rcParams["lines.markeredgewidth"] = 1 
    
  • das markeredgewidth oder mew Schlüsselwort Argument

Allerdings, wie @mwaskom in den Kommentaren darauf hinweist, gibt es eigentlich mehr dazu. In this issue wird argumentiert, dass Marker in zwei Klassen unterteilt werden sollten, Bulk Style Marker und Line Art Marker. Dies wurde teilweise in Matplotlib Version 2.0 erreicht, wo Sie ein "Plus" als Marker erhalten können, mit marker="P" und dieser Marker wird auch mit sichtbar sein.

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

enter image description here

+0

Ah; Ich denke, ich sollte in Zukunft immer "bekannte Probleme" prüfen. Danke für die Erweiterung der vorherigen Antwort. –

+1

Die beiden Probleme, auf die Sie verlinken, sind eigentlich ein ähnliches, aber separates Problem, das ein Fehler in Matplotlib 1.4.2 war. Das wichtigste Problem ist im Matplotlib Github hier: https://github.com/matplotlib/matplotlib/issues/4679. Dies wurde in Matplotlib 2 gehandhabt, indem "gefüllte" Versionen von Strichmarkierungen, z. '" P "' zeichnet unabhängig von der Linienbreite ein Plus. – mwaskom

2

Es ist sehr wie ein Fehler sein. Sie können jedoch Peilkante Linienbreite von mew Schlüsselwort gesetzt zu bekommen, was Sie wollen:

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

Das perfekt ist.Danke vielmals. –

Verwandte Themen