55415


PythonやRのデータフレームで、各カラムのデータがある程度同じスケールにあるとき  
それぞれのデータをラベルで色分けしながら1枚の散布図で出力するにはどのようにすればよいでしょうか?

irisデータによるサンプル  
<https://gist.github.com/netj/8836201>  
上記のリンク先のCSVファイルを下の画像のように出力したいと考えています。[![出力したい散布図の例](https://i.stack.imgur.com/pcw7s.png)](https://i.stack.imgur.com/pcw7s.png)

画像は下記のサイトのものを使用しています。  
<https://blog.magrathealabs.com/choosing-one-of-many-python-visualization-
tools-7eb36fa5855f>


CC BY-SA 4.0
2019-05-31T08:34:25.137
55402
2019-05-31T16:47:39.077
19500
question
python3 r pandas matplotlib
各カラムごとのデータをラベルで色分けしながら1枚の散布図に出力したい


たぶん欲しい回答とちがうかもだけど、力業だとこんな感じ？
scatterで何度も描けば重ね描きになるのでそれで行けると思います。テクニカルなやり方はちょっと私にはスキル不足。最近使い始めたばかりなので勉強中です。

[code]

        import pandas as pd
        import numpy as np
        import matplotlib.pyplot as plt
        df = pd.read_csv("iris.csv")
        l = {}
        df[0] = 1
        df[1] = 2
        df[2] = 3
        df[3] = 4
        l['Setosa']= df[df['variety'].isin(['Setosa'])]
        l['Versicolor'] = df[df['variety'].isin(['Versicolor'])]
        l['Virginica'] = df[df['variety'].isin(['Virginica'])]
    
        fig, ax = plt.subplots()
        label = ['petal.width','petal.length','sepal.width','sepal.length']
        for ix,c in [('Setosa','blue'), ('Versicolor','green'), ('Virginica','red')]:
            for i in range(3):
                ax.scatter(l[ix][label[i]].values, l[ix][i].values,c=c,alpha=0.3,edgecolors='face')
            ax.scatter(l[ix][label[3]].values, l[ix][3].values,c=c,alpha=0.3,edgecolors='face',label=ix)
    
        ax.set_xlabel('value')
        ax.set_ylabel('measurement')
        ax.set_ylim(0, 5)
        ax.set_yticks([1,2,3,4])
        ax.set_yticklabels(label)
        ax.set_xlim(-1, 9)
        ax.set_xticks([0,2,4,6,8])
        ax.legend()
        plt.show()
    
[/code]


CC BY-SA 4.0
2019-05-31T15:52:45.097
55413
2019-05-31T15:52:45.097
34277
55402
answer


pythonの場合は、pandas.melt() と seaborn.catplot() を使うのが簡単です。

[code]

    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    
    df = pd.read_csv('iris.csv')
    tmp = pd.melt(df, id_vars=['variety'], var_name='measurement', value_name='value')
    sns.catplot(x='value', y='measurement', hue='variety', data=tmp)
    plt.show()
    
[/code]

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


CC BY-SA 4.0
2019-05-31T16:47:39.077
55415
2019-05-31T16:47:39.077
24801
55402
answer