R有一个很好的绘图功能,称为geom_count
,可以非常灵活地显示频率/分类数据。我相信seaborn
对于此类图也有很多选择,但没有与geom_counts
功能完全匹配的特征,其中散布图点的大小由出现次数决定。
我只想坚持使用matplotlib
(也不必使用pandas
的数据框来获取简单的列表列表),所以我做了以下最少的示例/实现:
import matplotlib.pyplot as plt
from random import randint, choices
from collections import Counter
import string
base_list = list(string.ascii_uppercase[0:11])
newlist, count_dict = list(), dict()
for item in base_list:
newlist.append(choices(base_list, k=80))
for letter, item in zip(base_list,newlist):
count_dict[letter] = Counter(item)
plt.figure()
for x, xpos in enumerate(base_list):
for y, ypos in enumerate(base_list):
plt.scatter(x+1, y+1, s=count_dict[xpos][ypos]*20, c='b')
plt.show()
我对此感到不满意有几个原因:
plt.scatter
来绘制每个点既痛苦又缓慢。for
循环对我来说似乎非常难懂(在上述情况下,因为base_list
中的项数与newlist
中的项数相同,因此才有效)。 我可能可以概括为base_list
和newlist
中有不同数量的项目(请参阅指向geom_count
的链接中的最后一个数字)...
...但是在我继续之前,我想问问是否有人遇到过类似的问题/问题/代码,该问题/问题/代码仅使用 matplotlib
实现了基于出现次数的散点图大小调整?
答案 0 :(得分:1)
尝试一下
import matplotlib.pyplot as plt
from random import randint, choices
from collections import Counter
import string
import numpy as np
from operator import itemgetter
base_list = list(string.ascii_uppercase[0:11])
newlist, count_dict = list(), dict()
for item in base_list:
newlist.append(choices(base_list, k=80))
for letter, item in zip(base_list,newlist):
count_dict[letter] = Counter(item)
z=np.array([itemgetter(*base_list)(_temp) for _temp in itemgetter(*base_list)(count_dict)])
x,y=np.meshgrid(np.arange(len(base_list)),np.arange(len(base_list)))
plt.figure()
plt.scatter(x+1,y+1,s=z*20,c='b')
plt.show()