首页 > 解决方案 > Seaborn 绘制值列表与其索引

问题描述

我正在尝试利用 seaborn 绘制线图的潜力,但似乎我不断收到错误“TypeError:unhashable type:'list'”,我知道Accuracies 的数据框值存在问题是列表,尽管我不知道如何根据索引正确绘制列表(我也将其放入名为“Accuracy_Indexes”的列表中)。基本上我只是想在 X 轴上打印每个“精度”,在 Y 轴上打印它们的索引,色调为“Bin”。所以它是 X 和 Y 轴大小相同的两个列表。不确定 Catplot 是否是获得诸如线图之类的正确图,但我收到警告说它已经过时并且将来会被删除。

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

N=7
Accuracy_Indexes = list(range(1, 5))
df = pd.DataFrame({'Bin': np.random.randint(1,10,N)})
TheList = []
for item in range(N):
    TheList.append([item+1, np.random.random_sample(size=len(Accuracy_Indexes)).tolist()])
print(TheList)

df = pd.DataFrame.from_records(TheList,columns=['Bin','Accuracies'])
print(df)

g = sns.catplot(x=Accuracy_Indexes, y='Accuracies', hue="Bin",
                data=df, height=5, aspect=.8)
plt.show()

感谢您的任何建议。

标签: python-3.xlistplotseaborn

解决方案


Pandasexplode()可用于将列表转换为单独的行。Accuracy_Indexes以相同的顺序平铺可以使用这些索引创建一个新列。

下面是一些示例代码来说明这个想法:

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

N = 7
Accuracy_Indexes = list(range(1, 5))
df = pd.DataFrame({'Bin': np.random.randint(1, 10, N)})
TheList = []
for item in range(N):
    TheList.append([item + 1, np.random.random_sample(size=len(Accuracy_Indexes)).tolist()])

df = pd.DataFrame.from_records(TheList, columns=['Bin', 'Accuracies'])

df_long = df.explode('Accuracies', ignore_index=True)
df_long['Accuracy_Indexes'] = np.tile(Accuracy_Indexes, len(df))
df_long['Accuracies'] = df_long['Accuracies'].astype(float)

g = sns.catplot(x='Accuracy_Indexes', y='Accuracies', hue="Bin",
                data=df_long, height=5, aspect=.8)
plt.tight_layout()
plt.show()

猫图

从同一个数据框中,您还可以通过

g = sns.relplot(x='Accuracy_Indexes', y='Accuracies', hue="Bin",
                data=df_long, height=5, aspect=.8, kind='line')

请注意,relplotcatplot“图形级函数”,它一次创建一个完整的“图形”,带有一个或多个子图。如果要创建单个子图,可以使用轴级函数lineplot。控制图形大小的方法有点不同。

from matplotlib.ticker import MaxNLocator

plt.figure(figsize=(4, 5))
ax = sns.lineplot(x='Accuracy_Indexes', y='Accuracies', hue="Bin", data=df_long)
ax.xaxis.set_major_locator(MaxNLocator(integer=True))

线图


推荐阅读