python - 将分组的 seaborn 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))}
ltt= ['lt1','lt2']
methods=['method 1', 'method 2', 'method 3', 'method 4']
labels = ['label1','label2']
times = range(0,100,10)
data = pd.DataFrame(expandgrid(ltt,methods,labels, times, times))
data.columns = ['ltt','method','labels','dtsi','rtsi']
#data['nw_score'] = np.random.sample(data.shape[0])
data['nw_score'] = np.random.choice([0,1],data.shape[0])
data
Out[25]:
ltt method labels dtsi rtsi nw_score
0 lt1 method 1 label1 0 0 0
1 lt1 method 1 label1 0 10 1
2 lt1 method 1 label1 0 20 1
3 lt1 method 1 label1 0 30 1
4 lt1 method 1 label1 0 40 1
... ... ... ... ... ...
1595 lt2 method 4 label2 90 50 0
1596 lt2 method 4 label2 90 60 0
1597 lt2 method 4 label2 90 70 0
1598 lt2 method 4 label2 90 80 0
1599 lt2 method 4 label2 90 90 0
labels_fill = {0:'red',1:'blue'}
def facet(data,color):
data = data.pivot(index="dtsi", columns='rtsi', values='nw_score')
g = sns.heatmap(data, cmap=ListedColormap(['red', 'blue']), cbar=False,annot=True)
for l in data.ltt.unique():
# print(l)
with sns.plotting_context(font_scale=5.5):
g = sns.FacetGrid(data,row="labels", col="method+l", size=2, aspect=1,margin_titles=False)
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)
g.set_titles(template="")
for ax,m in zip(g.axes[0,:],methods):
ax.set_title(m, fontweight='bold', fontsize=12)
for ax,l in zip(g.axes[:,0],labels):
ax.set_ylabel(l, fontweight='bold', fontsize=12, rotation=0, ha='right', va='center')
# g.fig.tight_layout()
save_results_to = 'D:/plots'
if not os.path.exists(save_results_to):
os.makedirs(save_results_to)
g.savefig(save_results_to + l+ '.png', dpi = 300)
当我运行上面的代码时,我收到一条错误消息
ValueError:索引包含重复的条目,无法重塑
预期的图形格式
解决方案
问题来自您试图遍历这两个ltt
级别的事实,但是您没有在这些级别上过滤您的数据库。
for l in data.ltt.unique():
g = sns.FacetGrid(data[data.ltt==l], ....)
l
此外,您与用于ltt
级别的变量和第二次在循环中用于行标签的变量存在冲突。尝试在代码中使用更具描述性的变量名称。
这是完整的工作代码:
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))}
ltt= ['lt1','lt2']
methods=['method 1', 'method 2', 'method 3', 'method 4']
labels = ['label1','label2']
times = range(0,100,10)
data = pd.DataFrame(expandgrid(ltt,methods,labels, times, times))
data.columns = ['ltt','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):
data = data.pivot(index="dtsi", columns='rtsi', values='nw_score')
g = sns.heatmap(data, cmap=ListedColormap(['red', 'blue']), cbar=False,annot=True)
for lt in data.ltt.unique():
with sns.plotting_context(font_scale=5.5):
g = sns.FacetGrid(data[data.ltt==lt],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,method in zip(g.axes[0,:],methods):
ax.set_title(method, fontweight='bold', fontsize=12)
for ax,label in zip(g.axes[:,0],labels):
ax.set_ylabel(label, fontweight='bold', fontsize=12, rotation=0, ha='right', va='center')
g.fig.suptitle(lt, fontweight='bold', fontsize=12)
g.fig.tight_layout()
g.fig.subplots_adjust(top=0.8) # make some room for the title
g.savefig(lt+'.png', dpi=300)
lt1.png
lt2.png
推荐阅读
- rx-java - 如何在 RxJava 中制作冷单“热”
- apache-spark - 如何在 Kubernetes 容器/pod 上挂载 S3 存储桶?
- wpf - WPF BindingOperations.EnableCollectionSynchronization + ObservableCollection + Reentrancy
- c# - 在 Web 应用程序和 API 之间设置 Kerberos 2 跃点身份验证
- javascript - 执行一些代码后如何调用promise?
- hadoop - 如何解释 Hadoop Grep 命令输出
- javascript - PimCore 与 VueJS 和 VueJS-Router
- c# - ContentView Xamarin 表单
- asp.net - 在 window.open 之后重定向到另一个页面
- c++ - 具有固定大小数组成员的结构的 C++ 大括号初始化