2014-03-04 68 views
5

我有興趣構建向日葵散點圖(例如,http://www.jstatsoft.org/v08/i03/paper [PDF鏈接]中所述)。在我編寫自己的實現之前,有沒有人知道現有的實現?我意識到Stata和R中的函數,但我正在matplotlib中尋找一個函數。向日葵散點圖使用matplotlib

謝謝。

+0

你的數據看起來像什麼?具體而言,因爲數據沿着六邊形網格定位,所以向日葵圖不是真正的散點圖。你的定位是在一個六角網格上,還是你想在非網格位置上的向日葵形狀? – tom10

+0

正如在上面提到的論文中給出的例子,我的數據是「分散的」。當然,這些數據必須放入合適的六邊形網格單元中。 – cytochrome

+0

查看['plt.hexbin'](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.hexbin)直方圖,示例在這裏:http://stackoverflow.com/a/2371812/1643946。在頂部沒有標記,所以需要一些工作 – Bonlenfum

回答

6

我不知道任何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 = 1,和橙色花瓣1 = 5

這裏有一個顯而易見的改進之處是使用顏色映射。例如,你想要預設顏色邊界還是從數據等中計算顏色邊界?在這裏,我只是嘲笑了一下:我使用bins='log'只是爲了得到我使用的特定樣品的黃色和橙色細胞之間的合理比例;並且我硬編碼了白色,黃色和橙色細胞之間的邊界(3和12)。

能夠使用元組來指定matplotlib中的標記特徵使繪製所有不同的花瓣數真的很容易。

+0

優秀!經過一些調整,這種方法應該適用於我的應用程序。 – cytochrome

+0

太好了。我編輯了最後幾段,讓一些事情更清楚。 (如果你發佈,看看你最終會看到什麼會很有趣。) – tom10