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

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

ただいまの
回答率

90.61%

  • Python 3.x

    5944questions

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

  • Matplotlib

    284questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 207

genuine

score 10

 前提・実現したいこと

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

 該当のソースコード

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv('data.csv', names=['x', 'y', 'y_error'], header=None, encoding='utf-8')

df_A = df[1:15]
df_B = df[16:26]
df_C = df[27:]

plt.ylim([5, 7])
plt.xlim([30, 130])
plt.scatter(df_A['x'], df_A['y'], c='black', label='A')
plt.scatter(df_B['x'], df_B['y'], c='green', label='B')
plt.scatter(df_C['x'], df_C['y'], c='blue', label='C')
plt.grid(linestyle=':')

x_A = np.array(df_A['x'])
y_A = np.array(df_A['y'])
x_B = np.array(df_B['x'])
y_B = np.array(df_B['y'])
x_C = np.array(df_C['x'])
y_C = np.array(df_C['y'])
A_yerr = np.array(df_A['y_error'])
plt.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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • tachikoma

    2018/05/14 20:40

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

    キャンセル

  • genuine

    2018/05/14 23:23

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

    キャンセル

回答 1

checkベストアンサー

+4

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

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

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/14 23:23

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

    キャンセル

  • 2018/05/15 00:32

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

    キャンセル

  • 2018/05/15 09:07 編集

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

    キャンセル

  • 2018/05/15 09: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')

    キャンセル

  • 2018/05/23 18:23

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

    キャンセル

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

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python 3.x

    5944questions

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

  • Matplotlib

    284questions

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