2017-07-28 107 views
1

我有一個多邊形徑向圖,但是我無法弄清楚如何使圖形的其餘部分如y-tick線多邊形。Matplotlib徑向圖(極座標圖) - 子軸控制

radar.py

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

def _radar_factory(num_vars): 
    theta = 2*np.pi * np.linspace(0, 1-1./num_vars, num_vars) 
    theta += np.pi/2 

    def unit_poly_verts(theta): 
     x0, y0, r = [0.5] * 3 
     verts = [(r*np.cos(t) + x0, r*np.sin(t) + y0) for t in theta] 
     return verts 

    class RadarAxes(PolarAxes): 
     name = 'radar' 
     RESOLUTION = 1 

     def fill(self, *args, **kwargs): 
      closed = kwargs.pop('closed', True) 
      return super(RadarAxes, self).fill(closed=closed, *args, **kwargs) 

     def plot(self, *args, **kwargs): 
      lines = super(RadarAxes, self).plot(*args, **kwargs) 
      for line in lines: 
       self._close_line(line) 

     def _close_line(self, line): 
      x, y = line.get_data() 
      # FIXME: markers at x[0], y[0] get doubled-up 
      if x[0] != x[-1]: 
       x = np.concatenate((x, [x[0]])) 
       y = np.concatenate((y, [y[0]])) 
       line.set_data(x, y) 

     def set_varlabels(self, labels): 
      self.set_thetagrids(theta * 180/np.pi, labels) 

     def _gen_axes_patch(self): 
      verts = unit_poly_verts(theta) 
      return plt.Polygon(verts, closed=True, edgecolor='k') 

     def _gen_axes_spines(self): 
      spine_type = 'circle' 
      verts = unit_poly_verts(theta) 
      verts.append(verts[0]) 
      path = Path(verts) 
      spine = Spine(self, spine_type, path) 
      spine.set_transform(self.transAxes) 
      return {'polar': spine} 

    register_projection(RadarAxes) 
    return theta 

def radar_graph(labels = [], values = []): 
    N = len(labels) 
    theta = _radar_factory(N) 
    fig = plt.figure() 
    ax = fig.add_subplot(1, 1, 1, projection='radar') 
    ax.set_ylim(0,100) 
    ax.set_yticks([20, 40, 60, 80, 100]) 
    ax.set_yticklabels(['','','','','']) 
    ax.plot(theta, values, color='k', linestyle='dashed', linewidth=.2) 
    ax.fill(theta, values, color='#23B5BA') 
    ax.set_varlabels(labels) 

    plt.savefig("radar.png", dpi=100) 

這是我如何打電話radar.py生成圖形:

from radar import radar_graph 

labels = ['1', '2', '3', '4', '5'] 
values = [65, 66, 53, 54, 78] 

radar_graph(labels, values) 

正如你可以將此圖像y軸是圓形的,但整體的看結構是一個polygon.Radar圖片:

Radar Image

也許有一種方法可以轉換類似刺的yticks。

+3

快速簡單的黑客不會使用座標軸網格,而只需將網格繪製爲灰色和虛線樣式的線圖。 – ImportanceOfBeingErnest

+0

謝謝您的重要性,我同意它不是我希望的優雅解決方案,但它很容易完成。我添加了代碼,以防有人搜索時想知道如何添加該代碼。 – Vexiis

+1

那麼,你不是要在你的問題中提供答案。相反,您可以在回答欄中回答自己的問題。這樣問題就會有一個答案,以後可以接受。 – ImportanceOfBeingErnest

回答

0

解決方案認爲由ImportanceOfBeingErnest,而不是試圖改變默認的圓形子網格,我們只是隱藏它,並繪製我們想要的多邊形的子網格。

我們可以添加以下Radar.py

#Hide Circle Grid 
    ax.grid(alpha=0.0) 
    #Draw Sub-axis Grid 
    ax.plot(theta, [.5,.5,.5,.5,.5], color='grey', linestyle='solid', linewidth=.2, alpha=1) 
    ax.plot(theta, [20,20,20,20,20], color='grey', linestyle='solid', linewidth=.2, alpha=1) 
    ax.plot(theta, [40,40,40,40,40], color='grey', linestyle='solid', linewidth=.2, alpha=1) 
    ax.plot(theta, [60,60,60,60,60], color='grey', linestyle='solid', linewidth=.2, alpha=1) 
    ax.plot(theta, [80,80,80,80,80], color='grey', linestyle='solid', linewidth=.2, alpha=1) 

雖然我肯定有一個更好的解決方案,這個工程。