60844


matplotlibでレーダーチャートを描画したいのですが、うまくいきません。

以下を実行すると、新たに２次元のプロット図が作成されてしまい、レーダーチャートに反映されません。

[code]

    plt.xticks(angles[:-1], categories, color='grey', size=12)
    ax.set_rlabel_position(180)
    plt.yticks([1,2,3,4,5], ["1","2","3","4", "5"], color="grey", size=7)
    plt.ylim(0,5)
    
[/code]

スクリプト全文は以下です。

[code]

    import pandas as pd
    import matplotlib.pyplot as plt
    from math import pi
    %matplotlib notebook
    
    list1=[['5.0','4.9','4.8', '3.9', '4.7', '4.9', '4.7'], ['3.5','3.1','3.0','2.0','2.7','3.1','3.0'], ['4.3','4.3','3.9','2.6','3.6','3.9','4.2']]
    index1 = ["cluster0", "cluster1", "cluster2"]
    columns1 =["class","labo","job","access","facility","friends","life"]
    data = pd.DataFrame(data=list1, index=index1, columns=columns1)
    
    categories=list(data) 
    values_list = data.values.tolist()
    
    cluster0_list = values_list[0]
    cluster1_list = values_list[1]
    cluster2_list = values_list[2]
    
    cluster0_list += cluster0_list[:1]
    cluster1_list += cluster1_list[:1]
    cluster2_list += cluster2_list[:1]
    cluster0_list
    
    N = len(categories)
    angles = [n / float(N) * 2 * pi for n in range(N)]
    angles += angles[:1]
    
    ax = plt.subplot(111, polar=True)
    plt.xticks(angles[:-1], categories, color='grey', size=12)
    ax.set_rlabel_position(180)
    plt.yticks([1,2,3,4,5], ["1","2","3","4", "5"], color="grey", size=7)
    plt.ylim(0,5)
    
    ax.plot(angles, cluster0_list, linewidth=1,c='m', linestyle='solid')
    ax.plot(angles, cluster1_list, linewidth=1,c='m', linestyle='solid')
    ax.plot(angles, cluster2_list, linewidth=1,c='m', linestyle='solid')
    
    
[/code]


CC BY-SA 4.0
2019-11-24T15:56:25.070
60808
2019-11-26T00:26:29.213
36325
question
python matplotlib
matplotlibでレーダーチャートを描画


この2行を：

[code]

    plt.yticks([1,2,3,4,5], ["1","2","3","4", "5"], color="grey", size=7)
    plt.ylim(0,5)
    
[/code]

こちらに変えたら：

[code]

    plt.yticks([3,6,9,12,15], ["1","2","3","4", "5"], color="grey", size=7)
    plt.ylim(0,15)
    
[/code]

それらしき図になりましたけど。どうでしょうか？  
Y軸スケールの範囲指定の問題でしょうか。  
[![Example_Figure1](https://i.stack.imgur.com/vkTIX.png)](https://i.stack.imgur.com/vkTIX.png)


CC BY-SA 4.0
2019-11-25T01:14:36.317
60811
2019-11-25T01:14:36.317
26370
60808
answer


残念ながら、私の環境では『新たに２次元のプロット図が作成されてしまう』現象は再現されませんでした。  
が、とりあえず現状 `"文字列"` として扱われているデータを `"数値"`して扱うことで真っ当なグラフが表示されることは確認できました。

データを数値として扱うには、データフレーム作成部の

[code]

    data = pd.DataFrame(data=list1, index=index1, columns=columns1)
    
[/code]

に `dtype`パラメータを追加して

[code]

    data = pd.DataFrame(data=list1, index=index1, columns=columns1, dtype='float')
    
[/code]

と書くと良いかと思います。

今回動作がおかしいというグラフの整形部

[code]

    ax = plt.subplot(111, polar=True)
    plt.xticks(angles[:-1], categories, color='grey', size=12)
    ax.set_rlabel_position(180)
    plt.yticks([1,2,3,4,5], ["1","2","3","4", "5"], color="grey", size=7)
    plt.ylim(0,5)
    
[/code]

の部分ですが、現状でも問題なく動作しました。ただ、`pyplot`のAPIと AxesのAPIが混ざった状態になっていて（個人的に）気持ちがわるいので、

[code]

    ax = plt.subplot(111, polar=True)
    ax.set_xticks(angles[:-1])
    ax.set_xticklabels(categories, color='grey', size=12)
    ax.set_rlabel_position(180)
    ax.set_yticks([1,2,3,4,5])
    ax.set_yticklabels(["1","2","3","4","5"], color="grey", size=7)
    ax.set_ylim(0,5)
    
[/code]

のようにどちらか（今回の場合は後者）に統一するほうが個人的には好みです。

あと、データフレームを作成してからわざわざリストに変換するなど全体的に冗長な気がします。  
データの持ち方を少し変更するともう少しシンプルに書けるのではないでしょうか

[code]

    import pandas as pd
    import matplotlib.pyplot as plt
    import numpy as np
    %matplotlib notebook
    
    list1=[['5.0','4.9','4.8', '3.9', '4.7', '4.9', '4.7'],
           ['3.5','3.1','3.0','2.0','2.7','3.1','3.0'],
           ['4.3','4.3','3.9','2.6','3.6','3.9','4.2']]
    index1 = ["cluster0", "cluster1", "cluster2"]
    columns1 =["class","labo","job","access","facility","friends","life"]
    data = pd.DataFrame(data=list1, index=index1, columns=columns1, dtype='float').T
    
    data = pd.concat([data, data.iloc[[0]]])
    data['angles'] = np.linspace(0, 2*np.pi, len(data))
    data
    
    ax = plt.subplot(111, polar=True)
    data.plot(x='angles', ax=ax,linewidth=1, cmap='Dark2', linestyle='solid')
    ax.set_xticks(data.iloc[:-1, data.columns.get_loc('angles')])
    ax.set_xticklabels(data.index[:-1], color='grey', size=12)
    ax.set_rlabel_position(180)
    ax.set_yticks([1,2,3,4,5])
    ax.set_yticklabels(["1","2","3","4","5"], color='gray', size=7)
    ax.set_ylim(0,5)
    ax.grid(True)
    
[/code]

[![画像の説明をここに入力](https://i.stack.imgur.com/R74Fe.png)](https://i.stack.imgur.com/R74Fe.png)


CC BY-SA 4.0
2019-11-26T00:26:29.213
60844
2019-11-26T00:26:29.213
24801
60808
answer