我有一个歌曲列表。对于每首歌,我都有艺术家、作家和流派。
我想创建一个有向图,以便寻找模式。
所以,我想为每个艺术家都有一个节点,所以我将从基于艺术家对歌曲进行聚类开始。
然后我也想找到作曲家,并以某种方式安排已经聚集的歌曲,使它们靠近作者。
稍后我也会根据流派进行分组,但我坚持前两个。
所以,我的第一种方法是做类似(未测试)的事情:
pos_x = 20
for x in songs:
pos_y = 20
artist_list = [s for s in songs if s.artist==x.artist]
for y in len(artist_list):
artist_list[y].x = pos_x
pos_x += 10 * len(artist_list[y].title)
artist_list[y].y = pos_y
pos_y += 10
然后我会遍历艺术家列表,创建初始图表,但是当多个艺术家在一首歌上时会出现问题,例如We are the world。
但是,我相信在 Python 中这是一个非常有缺陷的方法,因为我的下一个方法是获取歌曲,使它们与艺术家相对接近,但循环获取作曲家并对组进行小的更改以使那些相关的接近在一起,因此艺术家的歌曲集群可能会被移动。
我习惯pyglet
这样做,所以基本上我在 OpenGL 中这样做。
我可以做的实际定位,但这是我关心的方法,因为我被困在如何解决这个问题上。
更新
我正在寻找的是这样的:
Song A1 Song A3 Song A2
Artist A
Artist B
Song B1 Song B2
我会有从 A1、A2、A3 到艺术家 A 的线路,以及从 B1、B2 到艺术家 B 的线路,但 A3 和 B1、B2 连接到艺术家 B,但我也希望艺术家 B 的位置更靠近 A2 和 B2这两首歌有同一个作曲家。
所以艺术家将是一个新的节点,与歌曲分开,但歌曲在每个集群中的实际放置将取决于至少一个其他关系。稍后我可能最终也会展示这种关系,这就是我现在在 3D 中映射的原因。