我想将行类别标签位置设置为左侧。默认情况下,seaborn设置为图形的右侧。
这篇文章讨论了一种可能的方法,但我不能让它在我的代码中工作。Python seaborn facetGrid: Is it possible to set row category label location to the left
以下是示例数据以及facetgrid
和热图绘图代码
import pandas as pd
import numpy as np
import itertools
import seaborn as sns
from matplotlib.colors import ListedColormap
print("seaborn version {}".format(sns.__version__))
# R expand.grid() function in Python
# https://stackoverflow.com/a/12131385/1135316
def expandgrid(*itrs):
product = list(itertools.product(*itrs))
return {'Var{}'.format(i+1):[x[i] for x in product] for i in range(len(itrs))}
methods=['method 1', 'method 2', 'method 3', 'method 4']
labels = ['label1','label2']
times = range(0,100,10)
data = pd.DataFrame(expandgrid(methods,labels, times, times))
data.columns = ['method','labels','dtsi','rtsi']
#data['nw_score'] = np.random.sample(data.shape[0])
data['nw_score'] = np.random.choice([0,1],data.shape[0])
labels_fill = {0:'red',1:'blue'}
def facet(data,color): #defining facet plot
data = data.pivot(index="dtsi", columns='rtsi', values='nw_score')
g = sns.heatmap(data, cmap=ListedColormap(['red', 'blue']), cbar=False,annot=True)
with sns.plotting_context(font_scale=5.5):
g = sns.FacetGrid(data,row="labels", col="method", size=2, aspect=1, margin_titles=True)
g = g.map_dataframe(facet)
g.add_legend()
# g.set(xlabel='common xlabel', ylabel='common ylabel')
g.set_titles(col_template="{col_name}", fontweight='bold', fontsize=18)
它会输出这个图形
所以我将@John Karasinski的解决方案添加到我的代码中,但仍然没有生成我想在文章末尾看到的图!
with sns.plotting_context(font_scale=5.5):
g = sns.FacetGrid(data,row="labels", col="method", size=2, aspect=1,margin_titles=True)
g = g.map_dataframe(facet)
g.add_legend()
# g.set(xlabel='common xlabel', ylabel='common ylabel')
g.set_titles(col_template="{col_name}", fontweight='bold', fontsize=18)
for i, axes_row in enumerate(g.axes):
for j, axes_col in enumerate(axes_row):
row, col = axes_col.get_title().split('|')
if i == 0:
axes_col.set_title(col.strip())
else:
axes_col.set_title('')
if j == 0:
ylabel = axes_col.get_ylabel()
axes_col.set_ylabel(row.strip() + ' | ' + ylabel)
plt.show()
我想要的图是;
谢谢!
发布于 2019-11-26 14:40:23
with sns.plotting_context(font_scale=5.5):
g = sns.FacetGrid(data,row="labels", col="method", size=2, aspect=1, margin_titles=False)
g = g.map_dataframe(facet)
g.add_legend()
g.set_titles(template='')
for ax,m in zip(g.axes[0,:],methods):
ax.set_title(m, fontweight='bold', fontsize=18)
for ax,l in zip(g.axes[:,0],labels):
ax.set_ylabel(l, fontweight='bold', fontsize=18, rotation=0, ha='right', va='center')
plt.tight_layout() # automatically adjust spacing of axes
https://stackoverflow.com/questions/59042009
复制