我的数据排列如下。这是来自具有100个基因座的数据集的示例。
loci head(%) tail(%) wing(%)
1 20 40 40
2 10 50 40
3 12 48 40
4 22 38 40
我希望为这些制作一个三元图,头部,尾部和翼部构成三角形的三个点。三角形的边缘代表百分比。我怎么能用熊猫开始这样做?任何指导都会有用。
答案 0 :(得分:2)
使用matplotlib和radar_chart example中的几个函数,我们可以直接从数据框创建雷达图。
在我们阅读数据框之前,您需要复制matplotlib提供的示例中的导入,radar_factory
和unit_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
由于您只想要head
,tail
和wing
,并且看起来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个尺寸)。
上面的代码会生成如下图表:
如果您将frame
行中的theta = radar_factory(N, frame='circle')
参数更改为polygon
,则会得到如下图表: