python-3.x - 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()
感谢您的任何建议。
解决方案
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')
请注意,relplot
和catplot
是“图形级函数”,它一次创建一个完整的“图形”,带有一个或多个子图。如果要创建单个子图,可以使用轴级函数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))
推荐阅读
- arrays - 如何每隔三个空格分割一个字符串?
- firebase - 如何在 Flutter 和 Firebase 的 Play 商店中实现应用内购买?
- c++ - 从多个线程渲染到同一个目标
- python - 从 CVXPY 数组中提取数字
- python - AttributeError:“元组”对象没有属性“写入”错误
- c# - 另一个 DbContext 上的 ASP.NET DbSet 标识属性
- c# - 日期字段未填充在 Razor 页面中
- git - WebStorm 的默认变更列表需要很长时间才能更新
- python - Python最有效的数据结构来保存值并检查值是否存在
- flutter - 无法构建 AAR,找不到任务“assembleAarDebug”