2017-07-28 12 views
1

私はポリゴンラジアルグラフを持っていますが、グラフの残りの部分と同様にyティックラインポリゴンを作成する方法はわかりません。Matplotlib Radial Graph(極座標プロット) - サブ軸コントロール

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するために呼び出す方法です:あなたは、y軸は円です。この画像が、全体的に見ることができるように

from radar import radar_graph 

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

radar_graph(labels, values) 

を構造はpolygon.Radarイメージです:

Radar Image

たぶん棘のような変態を変える方法があります。

+3

軸のグリッドを使用するのではなく、グレーの色と点線の線の線で描画するだけです。 – ImportanceOfBeingErnest

+0

ImportanceOfBeingErnestありがとう、私はそれが私が望んだエレガントなソリューションではないことに同意しますが、達成するのはかなり簡単でした。誰かがそれを追加する方法を知りたがっている場合に備えてコードを追加しました。 – 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) 

に以下を追加することができ、これは動作します。

関連する問題