使用Matplotlib绘制向日葵散点图

5

我对构建向日葵散点图很感兴趣(例如http://www.jstatsoft.org/v08/i03/paper [PDF链接]中所示)。在编写自己的实现之前,有人知道现有的实现吗?我知道Stata和R中的函数,但正在寻找matplotlib中的一个。

谢谢。


你的数据是什么样子?具体来说,向日葵图并不是真正的散点图,因为数据是沿着六边形网格定位的。你的数据是否定位在六边形网格上,或者你想要非网格位置的向日葵形状? - tom10
就像上述论文中所举的例子一样,我的数据是“分散的”。这些数据当然必须被分成适当的六边形网格单元。 - cytochrome
请查看plt.hexbin直方图,示例在这里:https://dev59.com/SXE95IYBdhLWcg3wSsGD#2371812。它没有顶部的标记,因此需要一些处理。 - Bonlenfum
谢谢。这是一个很好的开始。 - cytochrome
1个回答

8
我不知道有任何matplotlib的实现,但这并不难做到。在这里,我让hexbin进行计数,然后遍历每个单元格并添加相应数量的图案。:

enter image description here

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import colors

np.random.seed(0)
n = 2000
x = np.random.standard_normal(n)
y = 2.0 + 3.0 * x + 4.0 * np.random.standard_normal(n)

cmap = colors.ListedColormap(['white', 'yellow', 'orange'])
hb = plt.hexbin(x,y, bins='log', cmap=cmap, gridsize=20, edgecolor='gray')
plt.axis([-2, 2, -12, 12])
plt.title("sunflower plot")

counts = hb.get_array()
coords = hb.get_offsets()

for i, count in enumerate(counts):
    x, y = coords[i,:]
    count = int(10**count)
    if count>3 and count<=12:
        n = count // 1
        if n>1:
            plt.plot([x], [y], 'k.')
            plt.plot([x], [y], marker=(n, 2), color='k', markersize=18)
    if count>12:
        n = count // 5
        if n>1:
            plt.plot([x], [y], 'k.')
            plt.plot([x], [y], marker=(n, 2), color='k', markersize=18)

plt.show()

这里黄色的花瓣值为1,橙色的花瓣值为5。一个明显的改进点是与调色板一起工作。例如,您想要预设颜色边界还是从数据中计算它们等等?在这里,我只是稍微修改了一下:我使用了“bins ='log'”来获得我使用的特定样本中黄色和橙色单元格之间的合理比率;并且我还硬编码了白色、黄色和橙色单元格之间的边界(3和12)。能够使用元组在matplotlib中指定标记特征,使得绘制所有不同的花瓣数变得非常容易。

太好了!稍加调整,这种方法应该适用于我的应用程序。 - cytochrome
太好了。我编辑了最后几段,让一些事情更加清晰明了。(如果你发布的话,看看最终结果会很有趣。) - tom10

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