fill_between在极坐标(雷达)图中的多个内部和外部多边形之间

时间:2020-03-26 04:26:21

标签: python matplotlib fill radar-chart radial

我有多个重复项,每个重复项都有5个变量的一个值(下图上的细黑线)。我希望将数据“信封”设置为阴影状(在Inkscape中完成内部和外部遮罩):

matplotlib output with masking

我能够弄清楚的内容(对每个变量使用最小值和最大值): matplotlib output...shading based on min/max

基于:

import numpy as np
import random
import pandas as pd
from math import pi
from matplotlib import pyplot as plt
import matplotlib

outpath = "C:\\"
size = 30 # number of elements
var_lst = ["T", "W", "A", "S", "E"]   # var labels

# generate lists of example data for each var
trn = np.random.uniform(low=1.2, high=4.6, size=size).round(1)
wid = np.random.uniform(low=0.5, high=3.2, size=size).round(1)
ang = np.random.uniform(low=0.5, high=2.9, size=size).round(1)
spd = np.random.uniform(low=1.1, high=3.6, size=size).round(1)
elv = np.random.uniform(low=3.2, high=4.9, size=size).round(1)

# generate list of angles for plotting each variable
angles = [i / float(len(var_lst)) * 2 * pi for i in range(len(var_lst))]

# use dataframe to transform data
df = pd.DataFrame(dict(zip(var_lst,[trn,wid,ang,spd,elv])))

# generate list of element-wise lists
val_lst = df.values.tolist()

# define shaded region from min and max values of each element
am_min = []
am_max = []

for c in var_lst:
    min = df[c].min()
    max = df[c].max()
    am_min.append(min)
    am_max.append(max)

def copy_first(ls):
    '''copies first value of list and appends to end of same list'''
    ls.append(ls[0])
    return(ls)

# run function to close plotting loop 
for a in [[am_min,am_max,angles],val_lst]:
    for b in a:
        copy_first(b)

# plotting
fig,ax = plt.subplots(1,1,figsize=(10,10)) 

# # plot 100% of width and height extents...use as argument for all axes
ax_coords = [0, 0, 1, 1]

# # create polar axis
ax_polar =  fig.add_axes(ax_coords, projection='polar',label="ax polar")

# plot minima and maxima by property and fill ambient region
ax_polar.fill_between(angles, am_max, am_min, color="gainsboro", alpha=0.7)
ax_polar.fill_between(angles, am_min, am_max, color="gainsboro", alpha=0.7)

# plot individual elements
for v in val_lst:
    ax_polar.plot(angles, v, color='grey', linestyle='solid', linewidth=1)  

# turn off axes, labels, etc
ax_polar.axis('off')
ax.axis('off')

是否有一种简洁的方法来执行我要使用fill_between进行的操作(假设我可以确定哪些线对内部和外部周长有贡献)?我是否需要确定每个周界拐点的坐标?对geopandas中的元素执行某种地理处理?其他吗?

欢呼

编辑3月27日....

我知道我可以在元素“ for”循环中使用ax_polar.fill。尽管这对于外围而言可以接受,但是它遮住了甜甜圈孔。

0 个答案:

没有答案