仅在Python中使用matplotlib实现R的geom_count()

时间:2018-08-15 15:29:49

标签: python matplotlib ggplot2

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()

我对此感到不满意有几个原因:

  1. 对于较大的数据集,多次调用plt.scatter来绘制每个点既痛苦又缓慢。
  2. 两个显式的for循环对我来说似乎非常难懂(在上述情况下,因为base_list中的项数与newlist中的项数相同,因此才有效)。

我可能可以概括为base_listnewlist中有不同数量的项目(请参阅指向geom_count的链接中的最后一个数字)...

...但是在我继续之前,我想问问是否有人遇到过类似的问题/问题/代码,该问题/问题/代码仅使用 matplotlib 实现了基于出现次数的散点图大小调整?

1 个答案:

答案 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()