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

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

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

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

Python 3.x

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

Q&A

解決済

1回答

3228閲覧

Pythonとmatplotlibを使ってグラフ上にプロットした点とエラーバーを表示させたい。

genuine

総合スコア20

Matplotlib

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

Python 3.x

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

0グッド

0クリップ

投稿2018/05/14 09:35

前提・実現したいこと

Pythonとmatplotlibを使ってグラフ上にプロットした点とエラーバーを表示させたい。

発生している問題・エラーメッセージ

--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-59-9273d12e0b1e> in <module>() 6 y_C = np.array(df_C['y']) 7 A_yerr = np.array(df_A['y_error']) ----> 8 plt.errorbar(x_A, y_B, yerr=A_yerr) C:\Users\genuine\Anaconda3\lib\site-packages\matplotlib\pyplot.py in errorbar(x, y, yerr, xerr, fmt, ecolor, elinewidth, capsize, barsabove, lolims, uplims, xlolims, xuplims, errorevery, capthick, hold, data, **kwargs) 2927 xlolims=xlolims, xuplims=xuplims, 2928 errorevery=errorevery, capthick=capthick, data=data, -> 2929 **kwargs) 2930 finally: 2931 ax._hold = washold C:\Users\genuine\Anaconda3\lib\site-packages\matplotlib\__init__.py in inner(ax, *args, **kwargs) 1895 warnings.warn(msg % (label_namer, func.__name__), 1896 RuntimeWarning, stacklevel=2) -> 1897 return func(ax, *args, **kwargs) 1898 pre_doc = inner.__doc__ 1899 if pre_doc is None: C:\Users\genuine\Anaconda3\lib\site-packages\matplotlib\axes\_axes.py in errorbar(self, x, y, yerr, xerr, fmt, ecolor, elinewidth, capsize, barsabove, lolims, uplims, xlolims, xuplims, errorevery, capthick, **kwargs) 3028 xo, _ = xywhere(x, lower, noylims & everymask) 3029 lo, uo = xywhere(lower, upper, noylims & everymask) -> 3030 barcols.append(self.vlines(xo, lo, uo, **eb_lines_style)) 3031 if capsize > 0: 3032 caplines.append(mlines.Line2D(xo, lo, marker='_', C:\Users\genuine\Anaconda3\lib\site-packages\matplotlib\__init__.py in inner(ax, *args, **kwargs) 1895 warnings.warn(msg % (label_namer, func.__name__), 1896 RuntimeWarning, stacklevel=2) -> 1897 return func(ax, *args, **kwargs) 1898 pre_doc = inner.__doc__ 1899 if pre_doc is None: C:\Users\genuine\Anaconda3\lib\site-packages\matplotlib\axes\_axes.py in vlines(self, x, ymin, ymax, colors, linestyles, label, **kwargs) 1070 1071 if len(x) > 0: -> 1072 minx = x.min() 1073 maxx = x.max() 1074 miny = min(ymin.min(), ymax.min()) C:\Users\genuine\Anaconda3\lib\site-packages\numpy\core\_methods.py in _amin(a, axis, out, keepdims) 27 28 def _amin(a, axis=None, out=None, keepdims=False): ---> 29 return umr_minimum(a, axis, None, out, keepdims) 30 31 def _sum(a, axis=None, dtype=None, out=None, keepdims=False): TypeError: cannot perform reduce with flexible type

該当のソースコード

python

1import numpy as np 2import pandas as pd 3import matplotlib.pyplot as plt 4 5df = pd.read_csv('data.csv', names=['x', 'y', 'y_error'], header=None, encoding='utf-8') 6 7df_A = df[1:15] 8df_B = df[16:26] 9df_C = df[27:] 10 11plt.ylim([5, 7]) 12plt.xlim([30, 130]) 13plt.scatter(df_A['x'], df_A['y'], c='black', label='A') 14plt.scatter(df_B['x'], df_B['y'], c='green', label='B') 15plt.scatter(df_C['x'], df_C['y'], c='blue', label='C') 16plt.grid(linestyle=':') 17 18x_A = np.array(df_A['x']) 19y_A = np.array(df_A['y']) 20x_B = np.array(df_B['x']) 21y_B = np.array(df_B['y']) 22x_C = np.array(df_C['x']) 23y_C = np.array(df_C['y']) 24A_yerr = np.array(df_A['y_error']) 25plt.errorbar(x_A, y_A, yerr=A_yerr)

元のcsvファイルは32行×3列で、1,16,27行目にそれぞれ文字列と空白が含まれている以外は数値が入っている(はず)。

試したこと

いろいろ調べてみると、異なるタイプのデータが混在しているような気がしたので、np.array()でデータタイプを統一しようとしました(うまくいっているかは正直わかりません、初心者なもので)。

補足情報(FW/ツールのバージョンなど)

python3.6.1
matplotlib2.0.2
numpy1.12.1
pandas0.20.1

※ネットにアップすべきではない大事な情報が含まれており、少しコードとエラーメッセージを書き換えたので、おかしなところがあるかもしれませんが、エラーの概要は伝わると思います。

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

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

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

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

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

tachikoma

2018/05/14 11:40

np.arrayがどんな型を保持できるobject型のarrayになってるんじゃないですかね。データを貼ってもらえるとすぐ答えが得られると思いますよ。
genuine

2018/05/14 14:23

確認したところ、おっしゃる通りobject型のarrayになっていたためエラーが生じたようです。magichanさんが指摘してくださったようにskiprowsを導入することで解決できました。ありがとうございます。
guest

回答1

0

ベストアンサー

pandas.read_csv() にてデータを読み込んだ際に、途中に文字列が含まれておりますと、
その列のデータの型は object型 として扱われてしまいます。
その行を省いた後にastype()を使って型変換を行ってもよいのですが、
予め何行目に文字列(空白)があるのか分っているのであれば

Python

1df = pd.read_csv('data.csv',names=['x', 'y', 'y_error'], skiprows=[0,15,26])

のように、skiprows パラメータを使ってその行を読み飛ばすとよいかと思います。

あとは、print(df.dtypes) にて各列の型を確認し、各列が数値型として読み込まれていることを確認ください。

問題なく数値型で読み込まれておりましたら numpy 配列への変換は不要です。

投稿2018/05/14 11:55

編集2018/05/14 12:01
magichan

総合スコア15898

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

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

genuine

2018/05/14 14:23

skiprowsを導入することで解決できました。 ありがとうございます。
genuine

2018/05/14 15:32

追加で質問して申し訳ないですが… プロットした点の上にエラーバーが被るような形になりました。 ですが、見栄えの問題からエラーバーはプロットした点の下に持ってきて、はみ出る部分のみ表示させたいと思っています。 pyplot.errorbar()のオプションであるbarsaboveで解決できるかと思っていましたが、うまくいきません… この問題の解決法をご存じではないでしょうか。 よろしくお願いします。
magichan

2018/05/15 00:07 編集

plt.scatter() の前に plt.errorbar() を持ってきて描画の順番を変えるだけでよいかと思ったのですが・・・・駄目でした。 plt.errorbar() は何故か常に最上位に描写されていまうみたいですね。
magichan

2018/05/15 00:21

暫定的な解決方法となりますが、plt.scatter() で行っているポイントを描画する処理を plt.errorbar() で行い、現在 plt.errorbar() で引いているラインを引く処理を別途行うというのでどうでしょうか。 こんな感じ plt.plot(df.x, df.y, 'p-') #ラインを引く plt.errorbar(df.x[:14], df.y[:14], df.err[:14], fmt='ko', label='A') plt.errorbar(df.x[14:24], df.y[14:24], df.err[14:24], fmt='go', label='B') plt.errorbar(df.x[24:], df.y[24:], df.err[24:], fmt='bo', label='C')
genuine

2018/05/23 09:23

返信を忘れてしまい、申し訳ありません。 教えていただいた方法でやってみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問