如何在Python中绘制多维数据点

11

首先了解一些背景:

我想绘制不同歌曲的梅尔频率倒谱系数图表并进行比较。 我通过计算整首歌曲的MFCC,然后对它们取平均值得到一个由13个系数组成的数组。我希望这个数组表示图表上的一个点。

我是 Python 新手,并且对任何形式的绘图非常陌生(尽管我看到一些建议使用 matplotlib)。

我希望能够可视化这些数据。有什么想法吗?


2
首先,您必须考虑如何在视频平面中表示(x1,...,x13)点...之后您可以开始实现它。这不是Python的问题...我认为没有任何语言可以解决它。 - Michele d'Amico
你需要先将图形投影到二维平面上。这样,你的绘图看起来像三维图形(但实际上是在屏幕上呈现的,而屏幕本身就是二维的)。 - Yan King Yin
如果仍然相关,我建议查看RadViz库和函数:例如https://pandas.pydata.org/docs/reference/api/pandas.plotting.radviz.html - Marc
1个回答

9
首先,如果你想将一个由13个系数组成的数组表示为图中的单个点,则需要将这13个系数分解为您的图形中的维数数量,正如yan king yin在他的评论中指出的那样。 要将数据投影到2个维度中,您可以自己创建相关指标,例如最大值/最小值/标准偏差/...,或者应用降维方法,例如PCA。 是否这样做以及如何这样做是另一个话题。
然后,绘图很容易,可以按照以下方式完成: http://matplotlib.org/api/pyplot_api.html 我提供了一个解决方案的示例代码:
import matplotlib.pyplot as plt
import numpy as np

#fake example data
song1 = np.asarray([1, 2, 3, 4, 5, 6, 2, 35, 4, 1])
song2 = song1*2
song3 = song1*1.5

#list of arrays containing all data
data = [song1, song2, song3]

#calculate 2d indicators
def indic(data):
    #alternatively you can calulate any other indicators
    max = np.max(data, axis=1)
    min = np.min(data, axis=1)
    return max, min

x,y = indic(data)
plt.scatter(x, y, marker='x')
plt.show()

结果看起来像这样: 在此输入图片描述 但我想为你的根本问题提出另一个解决方案,即:绘制多维数据。我建议使用平行坐标图,可以使用相同的虚假数据构建:
import pandas as pd
pd.DataFrame(data).T.plot()
plt.show()

然后,结果显示每首歌曲的所有系数沿着x轴和它们的值沿着y轴。它应该如下所示: enter image description here 更新:
与此同时,我已经发现了 Python Image Gallery,其中包含两个高维可视化的很好的例子,并提供参考代码:

enter image description here

enter image description here


有没有其他方法可以散布高维数据?此外,使用pandas数据框绘制的图表因x轴上的名称而有点混乱。 - Eswar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接