python - 在 facetgrid 和热图 seaborn 中将行类别标签位置设置在左侧
问题描述
我想在左侧设置一个行类别标签位置。默认情况下,seaborn 设置在图表的右侧。
这篇文章讨论了一种可能的方法,但我无法让它在我的代码中工作。 Python seaborn facetGrid:是否可以将行类别标签位置设置在左侧
这是示例数据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()
我想要的图表是;
谢谢!
解决方案
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
推荐阅读
- c# - 将 BLE 设备数据读入 xamarin android 平板电脑应用程序
- python - 使用 `--without-heartbeat` 标志运行的 celery worker 对应用程序的影响
- php - 如何获得两个 hasManyThrough 的组合查询
- azure-devops - 如何从 Azure DevOps Timelines REST API 确定作业依赖关系图
- javascript - 如何在Vue JS的生命钩子循环中获取props值和使用
- python - 我应该使用 LassoCV 还是 GridSearchCV 来找到 Lasso 的最佳 alpha?
- python - 使用 CherryPy 按会话处理带宽使用情况
- java - 如何查看下载是否成功 downloadmanager
- google-docs - 获取 Google Docs Notes 的时间戳
- javascript - 按 dateModified 属性对对象项进行排序