用列表绘制小提琴图

时间:2020-05-11 13:52:56

标签: python matplotlib seaborn

我想用Python绘制小提琴图,以解决多元回归问题。我尝试获取时间序列输入的预测标量值。选择的库可能是matplotlib和/或seaborn,但我愿意接受其他建议。

这就是我所拥有的:

  1. 我的n个受试者中的每一个n个基本真理值的列表[g_1,g_2,... g_n]。
  2. k个时间序列输入(即列表)由我的n个主题中的每个j个元素组成。请注意,每个主题的k和j不必相等。
  3. 我的n个主题中的每一个的k个预测。

示例输入:

  • 真实情况:[14,67,342,5]
  • 时间序列输入:[[19,2434,23432,-123,-54],[99,23,4,-6],[1,2,3,4,5,6,7,8] ,[-1,-2,-3]]

执行回归后的示例输出:

  • 预测:[17,54,312,-2]

我想获得的是一个不错的小提琴图,如this tutorial所示。这是我的熊猫数据框的样子:

dataframe = pd.DataFrame(
{'Predictions': predictions, # This is a list of k elements 
 'Subject IDs': subjectIDs, # This is a list of n strings
 'Ground truths': groundtruths #  This is a list of n float values
})

尝试使用

绘制图
sns.violinplot( ax = ax, y = dataframe["Predictions"] ) 

仅导致:

TypeError:未找到与指定签名匹配的循环,并且未找到用于ufunc add的强制转换

此外,我还已经尝试使用命令

遵循官方seaborn documentation
ax = sns.violinplot(x="Subject IDs", y="Predictions", data=dataframe)

相反。但是,这只会导致

TypeError:不可散列的类型:“列表”


更新:如果我将“预测”列表视为元组,则可以成功创建一个没有错误的图,但不幸的是,由于将所有预测值都放在y轴上,因此该图已完全弄糟(请参见下面的代码段)。

Messed up violin plot


因此,我的问题是:如何在x轴上绘制所有主体ID,在y轴上显示地面实况并预测的概率分布,相应的平均值和置信区间为小提琴情节?

1 个答案:

答案 0 :(得分:0)

好的,我解决了我的问题。问题出在我的输入熊猫数据框。我必须确保为我的每个观察结果准确地分配了一个预测,而不是完整列表。

这是我的数据框的外观:

data = pd.DataFrame(
{'groundtruths': groundtruthsList,
 'predictions': predictionsList,
 'subjectIDs': subjectIDsList
})
print(data.head())

   groundtruths    predictions    subjectIDs  
 0    70            75.864983        01  
 1    70            50.814903        01  
 2    70            80.715569        01  
 3    70            70.627260        01  
 4    70            49.516285        01
 .    .                 .             .
 .    .                 .             .
 .    .                 .             .

现在,由于数据框具有正确的格式,因此我可以轻松地绘制精美的小提琴图

sns.violinplot(x="subjectIDs", y="predictions", data=data)

也可以使用一个简单的seaborn scatterplot来很好地说明该图中每个主题的基本事实。