質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

6584閲覧

Pythonでレーダーチャートを書いたらレイアウトが崩れる

Uzura1994

総合スコア17

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2018/06/14 08:58

編集2018/06/18 08:40

前提・実現したいこと

Python3系でレーダーチャートを作成したく
以下のサイトを参考に作成しておりました.
https://matplotlib.org/examples/api/radar_chart.html
https://teratail.com/questions/104066

しかしラベルをつけようとレイアウトが崩れてしまう問題が発生いたしました.

本来であれば下図になるものが
イメージ説明

私の結果は以下のようになってしまいます.

イメージ説明

###コード

使用したコードは以下になります.
コピペコードですので元のサイトを一緒に掲載させていただきます.

まずhttps://matplotlib.org/examples/api/radar_chart.htmlより
実際にレーダーチャートを作成する関数をお借りしました.

Python

1def radar_factory(num_vars, frame='circle'): 2 """Create a radar chart with `num_vars` axes. 3 4 This function creates a RadarAxes projection and registers it. 5 6 Parameters 7 ---------- 8 num_vars : int 9 Number of variables for radar chart. 10 frame : {'circle' | 'polygon'} 11 Shape of frame surrounding axes. 12 13 """ 14 # calculate evenly-spaced axis angles 15 theta = np.linspace(0, 2*np.pi, num_vars, endpoint=False) 16 # rotate theta such that the first axis is at the top 17 theta += np.pi/2 18 19 def draw_poly_patch(self): 20 verts = unit_poly_verts(theta) 21 return plt.Polygon(verts, closed=True, edgecolor='k') 22 23 def draw_circle_patch(self): 24 # unit circle centered on (0.5, 0.5) 25 return plt.Circle((0.5, 0.5), 0.5) 26 27 patch_dict = {'polygon': draw_poly_patch, 'circle': draw_circle_patch} 28 if frame not in patch_dict: 29 raise ValueError('unknown value for `frame`: %s' % frame) 30 31 class RadarAxes(PolarAxes): 32 33 name = 'radar' 34 # use 1 line segment to connect specified points 35 RESOLUTION = 1 36 # define draw_frame method 37 draw_patch = patch_dict[frame] 38 39 def fill(self, *args, **kwargs): 40 """Override fill so that line is closed by default""" 41 closed = kwargs.pop('closed', True) 42 return super(RadarAxes, self).fill(closed=closed, *args, **kwargs) 43 44 def plot(self, *args, **kwargs): 45 """Override plot so that line is closed by default""" 46 lines = super(RadarAxes, self).plot(*args, **kwargs) 47 for line in lines: 48 self._close_line(line) 49 50 def _close_line(self, line): 51 x, y = line.get_data() 52 # FIXME: markers at x[0], y[0] get doubled-up 53 if x[0] != x[-1]: 54 x = np.concatenate((x, [x[0]])) 55 y = np.concatenate((y, [y[0]])) 56 line.set_data(x, y) 57 58 def set_varlabels(self, labels): 59 self.set_thetagrids(np.degrees(theta), labels) 60 61 def _gen_axes_patch(self): 62 return self.draw_patch() 63 64 def _gen_axes_spines(self): 65 if frame == 'circle': 66 return PolarAxes._gen_axes_spines(self) 67 # The following is a hack to get the spines (i.e. the axes frame) 68 # to draw correctly for a polygon frame. 69 70 # spine_type must be 'left', 'right', 'top', 'bottom', or `circle`. 71 spine_type = 'circle' 72 verts = unit_poly_verts(theta) 73 # close off polygon by repeating first vertex 74 verts.append(verts[0]) 75 path = Path(verts) 76 77 spine = Spine(self, spine_type, path) 78 spine.set_transform(self.transAxes) 79 return {'polar': spine} 80 81 register_projection(RadarAxes) 82 return theta 83 84 85def unit_poly_verts(theta): 86 """Return vertices of polygon for subplot axes. 87 88 This polygon is circumscribed by a unit circle centered at (0.5, 0.5) 89 """ 90 x0, y0, r = [0.5] * 3 91 verts = [(r*np.cos(t) + x0, r*np.sin(t) + y0) for t in theta] 92 return verts

その後,magichan様によるコード(掲載元→https://teratail.com/questions/104066)によって整形いたしました.

Python

1N = 9 2theta = radar_factory(N, frame='polygon') 3 4label= ['A','B','C','D','E','F','G','H','I'] 5data = [3.0, 0.00, 2.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00] 6 7ax = plt.subplot(projection='radar') 8# chartの範囲を0-3 9ax.set_ylim(0, 3) 10# Grid線を位置の指定 11ax.set_rgrids([1, 2, 3]) 12# 描画処理 13ax.plot(theta, data, 'c.-') 14ax.fill(theta, data, facecolor='cyan', alpha=0.3) 15ax.set_varlabels(label) 16# 標準のグリッド線は円形なので消す(放射方向だけ残す) 17ax.yaxis.grid(False) 18# 替わりグリッド線を描く 19ax.plot(theta, [1]*N, 'k-', marker=None, linewidth=0.5, alpha=0.3) 20ax.plot(theta, [2]*N, 'k-', marker=None, linewidth=0.5, alpha=0.3) 21 22plt.show()

###やってみたこと

原因となっていそうなのが

Python

1ax.set_varlabels(label)

だと考えられます.
こちらをコメントアウトすると以下のようなレーダーチャートができます.

イメージ説明

考えられる可能性や解決方法がございましたら
ご教授いただきたいです.

初めて質問させていただいております.
不慣れな点もあるかと思いますが
どうかよろしくおねがいいたします.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

can110

2018/06/14 09:05

再現コードを提示すると解決しやすくなると思います。また、軸と角の数が合っていないようですが、それは良いのですか?
Uzura1994

2018/06/14 09:23

コメントありがとうございます.再現コードですが,リンク先の回答者の方が作成したものをそのまま使っています.転載になってしまいそうでしたのでこちらに書くことはいたしませんでした.軸と角の数についてですが,set_varlabelsが正しく実行されると軸と角の数が合うようになりそうです.
can110

2018/06/14 09:39

当方環境ではリンク先の画像の通り正しく描画されます。もし元コードの一部なりを改変していれば、その部分だけでも提示されると良いかと思います。
Uzura1994

2018/06/14 10:14

ご回答とご助言ありがとうございます.もう一度自身のコードを見直してみます!ありがとうございます.
magichan

2018/06/14 11:08

リンク先の回答者です。私が書いたコードに関しては転載していただいても全く問題ありません。
Uzura1994

2018/06/14 12:21

magichan様 ありがとうございます!質問の方編集させていただきます!
guest

回答2

0

自分の同じ箇所ではまっていたのですが、以下の処理を書き換えたら「theta += np.pi/2」をコメントアウトせず、90度回転(Aが上になるような表示)させることが出来ました。

python

1def set_varlabels(self, labels): 2 # 修正前 3 # self.set_thetagrids(np.degrees(theta), labels) 4 # 修正後 5 self.set_thetagrids(np.degrees(theta)%360, labels)

おそらく、thetaに含まれている座標が360を超えるとレイアウトが崩れてしまっているような気がします。360度を超えている場合はあまりを出すように修正するとレイアウトが綺麗に表示されました。

投稿2018/10/09 04:27

fireflydeath912

総合スコア18

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Uzura1994

2018/10/23 05:47

コメントが遅くなって申し訳ありません. 回答ありがとうございます! こちらの方法で試したら 私の環境でも綺麗に表示することができました! 助かりました! ありがとうございます!
guest

0

自己解決

怪しいところを片っ端からいじったらなんとかレーダーチャートになりました...

def radar_factoryの以下の部分をコメントアウトしたら解決しました.

Python

1#theta += np.pi/2

イメージ説明

しかしラベルの位置が0度のところから始まってしまっています....
でもデータとラベルがあってるのでまあ良しです!

ご回答にご協力いただきました皆様
ありがとうございました.

投稿2018/06/21 13:10

Uzura1994

総合スコア17

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問