2017-08-24 13 views
0

私はPythonでデータ解析を学び、matplotlibとseabornライブラリを使って、Kaggleでノートブックを作った。私はsepal leafsとpetal leafsの幅と長さの比を示す散布図を作ろうとしました。アイリスデータセットの散布図で色を変える

sns.FacetGrid(iris, hue="Species", size=10) 

total_rows = iris.count 
number_of_iris = len(iris) 

sepalLengths = iris["SepalLengthCm"] 
sepalWidths = iris["SepalWidthCm"] 

petalLengths = iris["PetalLengthCm"] 
petalWidths = iris["PetalWidthCm"] 

plt.scatter(range(number_of_iris),(sepalLengths/sepalWidths)) 
plt.xlabel("ID") 
plt.ylabel("Ratio") 
plt.show() 

出力はenter image description here

このコードが正しい動作しますが、私は3つの異なる種を区別するために、3つの異なる色でプロットを表示しようとしていますです。私はこのコードへの変更:

total_rows = iris.count 
number_of_iris = len(iris) 

sepalLengths = iris["SepalLengthCm"] 
sepalWidths = iris["SepalWidthCm"] 

petalLengths = iris["PetalLengthCm"] 
petalWidths = iris["PetalWidthCm"] 

sns.FacetGrid(iris, hue="Species", size=10) \ 
    .map(range(number_of_iris),(sepalLengths/sepalWidths)) \ 
    .add_legend() 

をが、エラーを受信:

--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-48-97e6cd0ab095> in <module>() 
    10 petalWidths = iris["PetalWidthCm"] 
    11 
---> 12 sns.FacetGrid(iris, hue="Species", size=10) .map(range(number_of_iris),(sepalLengths/sepalWidths)) .add_legend() 

どのように私は別の色に、各種をプロットしますか?

データの小さな部分である:

47,5.1,3.8, 1.34, 1.6,0.2, 8.0, Iris-setosa 
48,4.6,3.2, 1.44, 1.4,0.2, 7.0, Iris-setosa 
49,5.3,3.7, 1.43, 1.5,0.2, 7.5, Iris-setosa 
50,5.0,3.3, 1.52, 1.4,0.2, 7.0, Iris-setosa 
51,7.0,3.2, 2.19, 4.7,1.4, 3.36, Iris-versicolor 
52,6.4,3.2, 2.0, 4.5,1.5, 3.0, Iris-versicolor 
53,6.9,3.1, 2.23, 4.9,1.5, 3.27, Iris-versicolor 
54,5.5,2.3, 2.39, 4.0,1.3, 3.08, Iris-versicolor 
+0

私はあなたがFacetgrid.map'がどのように動作するか '誤解だと思います。 *関数*が第1引数として期待されます。あなたがここで達成しようとしていることがはっきりしていないこととは別に、あなたは最終的なプロットをどのように見えると思いますか?何がx軸とy軸にあるべきですか? ['lmplot'](https://seaborn.pydata.org/generated/seaborn.lmplot.html#seaborn.lmplot)をしたくないですか? – ImportanceOfBeingErnest

+0

私はこの[リンク](http://imgur.com/a/oHxey)のようなプロットを望んでいますが、それぞれの種類ごとに異なる色があります。この場合、ID1〜50は色が、51〜100が別の色、101〜150が第3の色でなければならない。 –

+0

http://seaborn.pydata.org/tutorial/axis_grids.html – mwaskom

答えて

2

Seabornは、データフレームに編成されたデータへのインターフェースを提供します。シーボーンを使用する場合は、データをDataFrameに保持し、おそらくプロットする列を追加することが理にかなっています。

import matplotlib.pyplot as plt 
import seaborn as sns 
iris = sns.load_dataset("iris") 
iris["ID"] = iris.index 
iris["ratio"] = iris["sepal_length"]/iris["sepal_width"] 

sns.lmplot(x="ID", y="ratio", data=iris, hue="species", fit_reg=False, legend=False) 

plt.legend() 
plt.show() 

enter image description here

同じことがそうのような通常のmatplotlibの散布図を用いて達成することができる。

import matplotlib.pyplot as plt 
import seaborn as sns 
iris = sns.load_dataset("iris") 

ratio = iris["sepal_length"]/iris["sepal_width"] 

for name, group in iris.groupby("species"): 
    plt.scatter(group.index, ratio[group.index], label=name) 

plt.legend() 
plt.show()