dポイントプレゼントキャンペーン実施中!

皆さまいつも丁寧な御回答ありがとうございます。
0.02, 5.9
0.13, 20.1
0.11, 1.4
0.27, 37.8
0.09, 55.9
0.22, 83.2
0.31, 12.1
0.44, 32.4
0.97, 83.1
0.72, 15
というデータ列があります。(SampleData.txt)
これを0.1刻みで積算したプロットを作りたいと考えています。
x<0.1の時は5.9+55.9=61.8
0.1<=x<0.2の時 20.1+1.4=21.5........というような感じです。
実際のデータ列は1000個ほどあります。
そこで先日のアドバイスも参考に以下のようなコードを組みました。
////////////以下プログラム//////////////////////////

import numpy as np
import matplotlib.pyplot as plt
import sys, string
from matplotlib.widgets import MultiCursor

x = np.arange(0, 1, 0.1)

dsum = [0]*len(x)

f = open("SampleData.txt", "r")

for line in f:
t = line.split(",")
p = float(t[0])
q = float(t[1])

j = 0
while j <= len(x):
if p <= x[j]:
dsum[j] += q
break
j += 0.1

y = dsum

plt.plot(x, y, c="g", mec="p")
plt.show()

ですが、
dsum[j] += q
TypeError: list indices mus be integers, not float
というエラーが出てしまいます。
どこかで、積算を整数ではない形へ変更しないといけないと思うのですが、どの部分を変更するのがよいのでしょうか・・・・?
ご回答よろしくお願いいたします。

また
https://oshiete.goo.ne.jp/qa/9288507.html
でご教授いただいた、整数のプロットと同時にプロットしたいと思っています。
0.1<=x<1は上記のもの、x<1は先日のものという感じです。
どのようなコードを書くのが適切でしょうか?
ご回答よろしくお願いいたします。

質問者からの補足コメント

  • つらい・・・

    x = np.arange(0, 1, 0.1)
    dsum = [0.0]*len(x)
    f = open("SampleData.txt", "r")
    for line in f:
    t = line.split(",")
    p = float(t[0])
    q = float(t[1])

    j = 0
    while j < len(x):
    if p < x[j]:
    dsum[j] += q
    break
    j += 1

    y = dsum

    plt.plot(x, y)
    plt.show()

    としたのですが、エラーは出ずグラフにデータは出力されません。
    どういうことなのでしょうか?
    (冒頭部は省略)

      補足日時:2016/05/29 23:51

A 回答 (3件)

> type(x) #=> <class 'list'>


> print(x) #=> [0.1, 0,2, ……]

失礼。
print( type(x) ) でした。

> 上記の部分はどういう意味でしょうか?

コンソールでプログラムを実行した場合に
xがリスト(list)オブジェクトなら <class 'list'> と表示するという意味です。
    • good
    • 0
この回答へのお礼

np.arangeの場合と変わらず、やはりグラフが出力されないのですが、どこが問題なんでしょう・・・?
ValueError: to_rgba:Invalid rgba arg "p"
to_rgb: Invalid rgb arg "p"
というエラーが出ています・・・(´;ω;`)
////////////////以下プログラム/////////////////////////////
import numpy as np
import matplotlib.pyplot as plt
import sys, string
from matplotlib.widgets import MultiCursor

x = np.arange(0, 1, 0.1)
type(x)
dsum = [0.0]*len(x)

f = open("SampleData2.txt", "r")

for line in f:
t = line.split(",")
p = float(t[0])
q = float(t[1])

j = 0
while j < len(x):
if p < x[j]:
dsum[j] += q
break
j += 1

y = dsum
print(x)
print(y)

plt.plot(x, y, c="g", mec="p")
plt.title("test")
plt.xlabel("x axis label")
#plt.xscale("log")
plt.xlim(0,2)
plt.ylabel("y axis label", fontsize = "20")
#plt.yscale("log")


plt.show()

お礼日時:2016/05/30 18:31

> つまり、x<=0.1, 0.1<x<=0.2, ......, 0.9<x<=1, 1<x<=2......


> といったかんじで場合分けをして積算をしたいと思っています。

x1 = [0.1,……,0,9]
x2 = [1.0,……,1000.0]
というリストオブジェクトを作成して
x = x1 + x2 です。


> としたのですが、エラーは出ずグラフにデータは出力されません。
> どういうことなのでしょうか?

私は numpyを使用したことがないのですが
np.arange(0, 1, 0.1)
は、リストオブジェクトを生成するのでしょうか?
確認下さい。

type(x) #=> <class 'list'>
print(x) #=> [0.1, 0,2, ……]
    • good
    • 0
この回答へのお礼

type(x) #=> <class 'list'>
print(x) #=> [0.1, 0,2, ……]

上記の部分はどういう意味でしょうか?
type(x)をプログラムに加えてみてもグラフは出力されませんでした・・・

お礼日時:2016/05/30 16:51

> TypeError: list indices mus be integers, not float



dsumの初期化時の要素を小数にします。
dsum = [0.0]*len(x)



その他
・jは要素番号を示すので、小数ではなく整数になります。
 また、要素番号は要素数nの場合、0~n-1です。

 while j < len(x): ← j<=ではない
 j += 1 ← 0.1ではない



・n <= x < n+0.1 という範囲であればif文の条件は以下ではないかと

 if p < x[j]: ← p <= ではない



> 整数のプロットと同時にプロットしたいと思っています。
> 0.1<=x<1は上記のもの、x<1は先日のものという感じです。

行いたいことがわかりません。

plt.plot(x, y, c="g", mec="p")

の段階で、x = [0.1, 0.2, ……]にどの様な値が入っていることを期待していますか?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

> 行いたいことがわかりません。
xには0~1000までの実数が入っています。
xを対数として、0~1までは0.1刻みでyの積算を、xが1~1000までは1刻みでyの積算をしたいと思っています。
つまり、x<=0.1, 0.1<x<=0.2, ......, 0.9<x<=1, 1<x<=2......
といったかんじで場合分けをして積算をしたいと思っています。

お礼日時:2016/05/29 22:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!