2017-12-21 5 views
2

Ich habe eine grundlegende Heatmap erstellt mit der seaborn Bibliothek, und möchte die Farbleiste von der Standardeinstellung, vertikal und auf der rechten Seite, in eine horizontale oberhalb der Heatmap verschieben. Wie kann ich das machen?Seaborn Heatmap: Move Farbbalken auf dem Grundstück

Hier einige Datenprobe und ein Beispiel für die Standard:

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

# Create data 
df = pd.DataFrame(np.random.random((5,5)), columns=["a","b","c","d","e"]) 

# Default heatma 
ax = sns.heatmap(df) 
plt.show() 

default heatmap

Antwort

2

bei the documentation suchen wir ein Argument cbar_kws finden. Dies ermöglicht die Angabe eines Arguments, das an die fig.colorbar Methode von matplotlib übergeben wird.

cbar_kws: dict des Schlüssels, Wertmappings, optional. Schlüsselwortargumente für fig.colorbar.

So können wir jede der möglichen Argumente fig.colorbar verwenden, um ein Wörterbuch zu cbar_kws bereitstellt.

In diesem Fall brauchen Sie location="top", um die Farbleiste oben zu platzieren. Da standardmäßig die Farbleiste mithilfe einer Rasterspezifikation positioniert, die dann keine Festlegung der Position zulässt, müssen wir diese Rasterspezifikation deaktivieren (use_gridspec=False).

sns.heatmap(df, cbar_kws = dict(use_gridspec=False,location="top")) 

Komplettes Beispiel:

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

df = pd.DataFrame(np.random.random((5,5)), columns=["a","b","c","d","e"]) 

ax = sns.heatmap(df, cbar_kws = dict(use_gridspec=False,location="top")) 

plt.show() 

enter image description here

+0

Dies ist die einfachste Antwort, danke! – r3robertson

2

Sie haben Teiler verwenden Achsen colorbar auf einem Seaborn beziffern. Suchen Sie nach den Kommentaren.

import matplotlib.pyplot as plt 
import seaborn as sns 
import pandas as pd 
import numpy as np 
from mpl_toolkits.axes_grid1.axes_divider import make_axes_locatable 
from mpl_toolkits.axes_grid1.colorbar import colorbar 

# Create data 
df = pd.DataFrame(np.random.random((5,5)), columns=["a","b","c","d","e"]) 

# Use axes divider to put cbar on top 
# plot heatmap without colorbar 
ax = sns.heatmap(df, cbar = False) 
# split axes of heatmap to put colorbar 
ax_divider = make_axes_locatable(ax) 
# define size and padding of axes for colorbar 
cax = ax_divider.append_axes('top', size = '5%', pad = '2%') 
# make colorbar for heatmap. 
# Heatmap returns an axes obj but you need to get a mappable obj (get_children) 
colorbar(ax.get_children()[0], cax = cax, orientation = 'horizontal') 
# locate colorbar ticks 
cax.xaxis.set_ticks_position('top') 

plt.show() 

enter image description here

Für mehr Informationen zu diesem offiziellen Beispiel matplotlib lesen: https://matplotlib.org/gallery/axes_grid1/demo_colorbar_with_axes_divider.html?highlight=demo%20colorbar%20axes%20divider

Heatmap Argument wie sns.heatmap(df, cbar_kws = {'orientation':'horizontal'}) ist nutzlos, da sie colorbar unten Position.

+0

In Bezug auf den letzten Satz hier: Sie müssten 'cbar_kws = {" location ":" top "," use_gridspec ": False}' wie in [meine Antwort] (https://stackoverflow.com/a/47916308/4124317). – ImportanceOfBeingErnest

2

Ich würde gerne ein Beispiel mit Subplots zeigen, die es erlauben, die Größe des Plots zu kontrollieren, um die quadratische Geometrie der Heatmap zu erhalten. Dieses Beispiel ist sehr kurz:

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

# Create data 
df = pd.DataFrame(np.random.random((5,5)), columns=["a","b","c","d","e"]) 

# Define two rows for subplots 
fig, (cax, ax) = plt.subplots(nrows=2, figsize=(5,5.025), gridspec_kw={"height_ratios":[0.025, 1]}) 

# Draw heatmap 
sns.heatmap(df, ax=ax, cbar=False) 

# colorbar 
fig.colorbar(ax.get_children()[0], cax=cax, orientation="horizontal") 

plt.show() 

enter image description here