在熊猫中创造三元地块

时间:2017-01-10 17:35:41

标签: python pandas

我的数据排列如下。这是来自具有100个基因座的数据集的示例。

loci      head(%)     tail(%)     wing(%) 
1         20          40          40
2         10          50          40
3         12          48          40
4         22          38          40 

我希望为这些制作一个三元图,头部,尾部和翼部构成三角形的三个点。三角形的边缘代表百分比。我怎么能用熊猫开始这样做?任何指导都会有用。

1 个答案:

答案 0 :(得分:2)

使用matplotlib和radar_chart example中的几个函数,我们可以直接从数据框创建雷达图。

在我们阅读数据框之前,您需要复制matplotlib提供的示例中的导入,radar_factoryunit_poly_verts函数。显然,您还需要pandas

您的导入将如下所示:

import matplotlib.pyplot as plt
from matplotlib.path import Path
from matplotlib.spines import Spine
from matplotlib.projections.polar import PolarAxes
from matplotlib.projections import register_projection
import pandas as pd
import numpy as np

由于您只想要headtailwing,并且看起来loci是索引,因此我使用user_col="loci"导入了数据集。这意味着数据框在导入时看起来像这样:

      head(%)  tail(%)  wing(%)
loci
1          20       40       40
2          10       50       40
3          12       48       40
4          22       38       40

最后,您要创建一个与示例中的代码类似的函数,而是读取数据帧。下面的代码应该这样做,并且基于'__main__'块中的代码。我删除了一些本示例不需要的代码,并且对代码进行了未加工编码:

def nColors(k=2, cmap='spectral'):
    if type(cmap) == str:
        cm = plt.get_cmap(cmap)
        colors = [cm(1.*i/(k-1)) for i in range(k)]
    elif cmap==None:
        colors = ['k']
    else:
        colors = cmap
    return colors

def plot_radar(data):
    N = data.shape[1] 
    theta = radar_factory(N, frame='circle')

    spoke_labels = data.columns.tolist()
    fig = plt.figure(figsize=(9, 9))
    fig.subplots_adjust(wspace=0.25, hspace=0.20, top=0.85, bottom=0.05)

    ax = fig.add_subplot(111, projection='radar')

    colors = nColors(len(data), cmap='spectral')

    for i, (index, d) in enumerate(data.iterrows()):
        ax.plot(theta, d.tolist(), color=colors[i])
        ax.fill(theta, d.tolist(), facecolor=colors[i], alpha=0.25)

    ax.set_varlabels(spoke_labels)
    plt.show()

调用此函数并传递数据框:

plot_radar(df)

此代码使用spectral颜色映射,但您可以通过将colors = nColors(len(data))行中的有效颜色映射作为第二个参数进行更改。

您可以有圆形或多边形(在这种情况下为三角形,因为有3个尺寸)。

上面的代码会生成如下图表:

Circle Plot

如果您将frame行中的theta = radar_factory(N, frame='circle')参数更改为polygon,则会得到如下图表:

Polygon Chart