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

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

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

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

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1727閲覧

あやめデータの散布図をmatplotで描画したい

soft_cream

総合スコア11

Matplotlib

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

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/11/14 05:37

編集2021/11/14 07:16

がくの長さ(SL)、がくの幅(SW)、花弁の長さ(PL)、花弁の幅(PW)のうちの二つを選択して縦軸・横軸とし
あやめの種類ごとに色分けした散布図を描画したいです。
コード欄のプログラムを実行すると、以下のようなエラーが表示され
点が描画されていない、軸のみの散布図が出力されました。
ーーーーーーーーーーーーーーーーーーーーーーー
C:OOOOOOOOOOOOO>python samp.py SL PL (実行コマンド)
C:OOOOOOOOOOOOO\matplotlib\collections.py:1120: UserWarning: Collection without array used. Make sure to specify the values to be colormapped via the c argument.
warnings.warn("Collection without array used. Make sure to "
ーーーーーーーーーーーーーーーーーーーーーーー
c引数でカラーマップされる値を指定する、とはどういうことなのでしょうか。
エラーがなぜ出力されるのか
またどのように改善すればよいのか教えていただきたいです。

Python

1import csv 2import sys 3class Iris: 4 def __init__(self, data_list): 5 if not isinstance(data_list, list): 6 print("データがリスト形式ではありません") 7 return 8 self.sepal_length = float(data_list[0]) 9 self.sepal_width = float(data_list[1]) 10 self.petal_length = float(data_list[2]) 11 self.petal_width = float(data_list[3]) 12 self.species = data_list[4] 13 14 def printData(self): 15 print("がく長={0:5.2f}, がく幅={1:5.2f}, 花弁長={2:5.2f}, 花弁幅={3:5.2f}, "\ 16 "種類={4:5s}".format(self.sepal_length,self.sepal_width, self.petal_length,\ 17 self.petal_width,self.species)) 18 19import matplotlib.pyplot as plt 20import matplotlib.font_manager as fm 21import matplotlib.colors as mc 22import numpy as np 23 24def getFontProperty(size_str): 25 font_prop = fm.FontProperties() 26 font_prop.set_style('normal') 27 font_prop.set_weight('light') 28 font_prop.set_size(size_str) 29 return font_prop.copy() 30 31def getTarget(data): 32 length = len(data) 33 target_list = [] 34 for i in range(length): 35 if (data[i].species == 'Setosa'): 36 target_list.append(0) 37 elif (data[i].species == 'Versicolor'): 38 target_list.append(1) 39 elif (data[i].species == 'Virginica'): 40 target_list.append(2) 41 return np.array(target_list) 42 43def extract(str, data):# data : list of Iris 44 length = len(data) 45 ext_list = [] 46 label = None 47 if (str == 'SL'): 48 label = 'Sepal Length' 49 for i in range(length): 50 ext_list.append(data[i].sepal_length) 51 elif (str == 'SW'): 52 label = 'Sepal Width' 53 for i in range(length): 54 ext_list.append(data[i].sepal_width) 55 elif (str == 'PL'): 56 label = 'Petal Length' 57 for i in range(length): 58 ext_list.append(data[i].petal_length) 59 elif (str == 'PW'): 60 label = 'Petal Width' 61 for i in range(length): 62 ext_list.append(data[i].petal_width) 63 return np.array(ext_list), label 64 65def runScatterPlot(str1, str2, data): 66 x, label1 = extract(str1, data) 67 y, label2 = extract(str2, data) 68 labels = getTarget(data) 69 70 colors = ['red','green','blue'] 71 species = ['Setosa','Virginica','Versicolor'] 72 73 fp2 = getFontProperty('20') 74 fp3 = getFontProperty('15') 75 76 fig = plt.figure(figsize=(10,10)) 77 ax = fig.add_axes([0.1,0.1,0.85,0.85]) 78 79 scale=50.0 80 scatter = plt.scatter(x,y, s=scale, c=labels, cmap=mc.ListedColormap(colors)) 81 plt.xlabel(label1,fontsize=20,font_properties=fp2) 82 plt.ylabel(label2,fontsize=20,font_properties=fp2) 83 plt.xticks(fontsize=15) 84 plt.yticks(fontsize=15) 85 plt.title('IRIS DATA',fontsize=30,font_properties=fp2) 86 87 handles, labels = scatter.legend_elements(prop="colors", alpha=0.6) 88 legend = ax.legend(handles, species, loc="best", shadow=True, prop=fp3) 89 90 fname = "Iris-scatter-plot_X_" + str1+"_Y_"+str2 91 f1 = fname+".jpg" 92 f2 = fname+".pdf" 93 plt.savefig(f1) 94 plt.savefig(f2) 95 plt.show() 96 97def goodParams(str1, str2): 98 str_set = {'SL', 'SW', 'PL', 'PW'} 99 if ((str1 != str2) and (str1 in str_set) and (str2 in str_set)): 100 return True 101 else: 102 return False 103 104if __name__ == "__main__": 105 num_args = len(sys.argv) 106 if (num_args != 3): 107 print("python IrisScatterPlot.py [a pair from (SL SW PL PW)] (e.g. SL PL )") 108 sys.exit() 109 str1 = sys.argv[1] 110 str2 = sys.argv[2] 111 if (not goodParams(str1, str2)): 112 print("入力パラメータはSL,SW,PL,PWの4つの属性名から異なる2つを選択してください") 113 sys.exit() 114 fname = "iris.csv" 115 try: 116 with open(fname, "r", newline='', encoding='utf-8') as fin: 117 lines = csv.reader(fin, delimiter=',') 118 data = [] 119 first = True 120 for line in lines: 121 if first: 122 first = False 123 continue 124 iris = Iris(line) 125 data.append(iris) 126 runScatterPlot(str1, str2, data) 127 except FileNotFoundError: 128 print("ファイル:",fname," が見つかりません") 129 sys.exit()

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

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

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

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

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

jimbe

2021/11/14 07:10

タグの c は c言語を表すためのものです。 幾らエラーメッセージに "c" が含まれるとはいえ、Python のご質問であれば外して頂いたほうが良いように思います。
soft_cream

2021/11/14 07:17

何かC言語と関係するエラーなのかと勘違いしていました。 修正させていただきました。
guest

回答2

0

ベストアンサー

以下の部分で labels が空リストになっていることが原因です。

python

1 scatter = plt.scatter(x,y, s=scale, c=labels, cmap=mc.ListedColormap(colors))

なぜ、空になっているのかは、以下の部分で species の名前の比較に失敗しているからです。

python

1def getTarget(data): 2 length = len(data) 3 target_list = [] 4 for i in range(length): 5 if (data[i].species == 'Setosa'): 6 target_list.append(0) 7 elif (data[i].species == 'Versicolor'): 8 target_list.append(1) 9 elif (data[i].species == 'Virginica'): 10 target_list.append(2) 11 return np.array(target_list)

元の CSV ファイルの species は全て小文字になっているのではないかと思います。なので、これらを小文字に修正します(case insensitive で比較してもよろしいかと)。

python

1def getTarget(data): 2 length = len(data) 3 target_list = [] 4 for i in range(length): 5 if (data[i].species == 'setosa'): 6 target_list.append(0) 7 elif (data[i].species == 'versicolor'): 8 target_list.append(1) 9 elif (data[i].species == 'virginica'): 10 target_list.append(2) 11 return np.array(target_list)

scatter plot

投稿2021/11/14 07:43

編集2021/11/14 07:45
melian

総合スコア19865

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

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

soft_cream

2021/11/14 08:04

回答ありがとうございます。 教えていただいた修正で期待していた結果が得られました。 小文字と大文字も含めて、もう少しデータを注意深く見るように気を付けます。 ありがとうございました。
guest

0

色指定がどうこうという以前に、

python

1 scatter = plt.scatter(x,y, s=scale, c=labels, cmap=mc.ListedColormap(colors))

のx, yが文字列であることが問題です。

matplotlib で散布図 (Scatter plot) を描くなどをよく読んで書き直してみることをお勧めします。

投稿2021/11/14 07:21

ppaul

総合スコア24666

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

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

soft_cream

2021/11/14 08:02

回答ありがとうございます。 教えていただいたサイトを参考にしたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問