2017-10-02 20 views
0

メモ帳ファイルのいくつかのデータに基づいて、ヒストグラムをPythonでプロットする必要があります。 私のメモ帳ファイルには、各行に私は0から255までの10の仮説数を持って、10000行が含まれています。メモ帳ファイルのデータからヒストグラムをPythonでプロットするには?

.... 
.... 
[205 246 19 68 118 44 45 72 210 162] 
[205 246 19 68 118 44 45 72 210 162] 
[205 246 19 68 118 44 45 72 210 162] 
[205 246 19 68 118 44 72 45 210 162] 
[205 246 19 68 118 44 45 72 210 162] 
[246 205 19 68 118 44 72 45 210 162] 
[205 246 19 68 118 44 72 45 210 162] 
[205 246 19 68 118 44 72 45 210 162] 
[205 246 19 68 118 44 72 45 210 162] 
[205 246 19 68 118 44 72 45 210 162] 
[205 246 19 68 118 44 72 45 210 162] 
[205 246 19 68 118 44 72 45 210 162] 
[205 246 19 68 118 44 72 45 210 162] 
[205 246 19 68 118 44 72 45 210 162] 
[205 246 19 118 44 68 72 45 210 162] 
[205 246 19 118 68 44 72 45 210 162] 
[205 246 19 118 68 44 72 45 210 162] 
[205 246 19 118 68 44 72 45 210 162] 
[205 246 19 118 68 44 72 45 210 162] 

だから私の目標は、各数は全部で何回繰り返すかをチェックし、最後の行を取ることですメモ帳ファイル。

たとえば、これは私の最後の行[205 246 19 118 68 44 72 45 210 162]です。すべてのファイルの各番号の繰り返し回数に基づいてヒストグラムをプロットする必要があります。

import matplotlib.pyplot as plt 
import numpy as np 
fileHandle = open('path_File',"rb") 
lineList = fileHandle.readlines() 
fileHandle.close() 
print (lineList) 
print ("The last line is:") 
print (lineList[-1]) 

私はこのコードから最後の行を抽出し、私はそれに基づいてヒストグラムをプロットする方法を、すべてのファイル内の各番号の繰り返しを計算することができません:?私はそのランクを抽出するよりも、必要

+2

ファイルには、あまりにもそれらのブラケットを持っていますか? –

+0

注文は問題ですか? (最後の行と最初の行の例は、整数の順序によってのみ異なります) – PrestonM

+1

@cᴏʟᴅsyouこれについて[[]について話しているなら、そうです。事前に感謝します – tierrytestu

答えて

0

はパンダのライブラリを使用した例です。

import StringIO #python3: io 
import pandas as pd 
import matplotlib.pyplot as plt 

string = """[205 246 19 68 118 44 45 72 210 162] 
[205 246 19 68 118 44 45 72 210 162] 
[205 246 19 68 118 44 45 72 210 162] 
[205 246 19 68 118 44 72 45 210 162] 
[205 246 19 68 118 44 45 72 210 162] 
[246 205 19 68 118 44 72 45 210 162] 
[205 246 19 68 118 44 72 45 210 162] 
[205 246 19 68 118 44 72 45 210 162] 
[205 246 19 68 118 44 72 45 210 162] 
[205 246 19 68 118 44 72 45 210 162] 
[205 246 19 68 118 44 72 45 210 162] 
[205 246 19 68 118 44 72 45 210 162] 
[205 246 19 68 118 44 72 45 210 162] 
[205 246 19 68 118 44 72 45 210 162] 
[205 246 19 118 44 68 72 45 210 162] 
[205 246 19 118 68 44 72 45 210 162] 
[205 246 19 118 68 44 72 45 210 162] 
[205 246 19 118 68 44 72 45 210 162] 
[205 246 19 118 68 44 72 45 210 162]""" 

# Here we clean the file from [] and spaces " " creating a generator 
clean = (i.strip()[1:-1].split() for i in StringIO.StringIO(string)) #py3 io.String...() 

# But this code here is what you want to comment out and modify 
#with open("path/to/file.txt") as f: 
# clean = (i.strip()[1:-1].split() for i in f.readlines()) 

# Create the dataframe 
df = pd.DataFrame(clean) 

# Counts all items and put them in a dict 
dict_count = df.apply(pd.value_counts).sum(axis=1).to_dict() 

# Dict with last row count (based on dict_count) 
dict_values = {i:dict_count[i] for i in df.tail(1).values[0].tolist()} 

# Plot a bar? 
# https://stackoverflow.com/questions/16010869/python-plot-a-bar-using-matplotlib-using-a-dictionary 
plt.bar(range(len(dict_values)), dict_values.values(), align='center') 
plt.xticks(range(len(dict_values)), dict_values.keys()) 

plt.show() 

enter image description here

+0

これはまさに私がやりたいことですが、私のデータはファイルから抽出されます:それでは、私はこのエラーを出します:clean =(i.strip()[1:-1] .split()for i for io.StringIO行リスト)) TypeError:initial_valueは、バイトではなく、strまたはNoneでなければなりません – tierrytestu

+0

私はpy2を使用していると思いますので、コードを少し変更しました。グラフは変な見た目になります。しかし、その考えは正しい。 –

+0

私はそれが私に正しいソリューションを提供すると確信しています、問題は私がファイルから自分のデータで文字列を変更するときです:fileHandle = open( 'Path_File。string = fileHandle.readlines() print(文字列)このエラーが発生しました。TypeError:initial_valueはstrまたはNoneでなければなりません。リストは ではありません。 、コードが正しく動作します。 – tierrytestu

0

ここには、各要素がファイルの行である配列があります。 すべての行が同じように書式設定されている場合は、すべての行をループしてカウンタを使用できます。

import matplotlib.pyplot as plt 
import numpy as np 
fileHandle = open('path_File',"rb") 
lineList = fileHandle.readlines() 
fileHandle.close() 
print (lineList) 
print ("The last line is:") 
print (lineList[-1]) 
count = 0 
# The [:-1] says that you take all the values but the last one 
for line in lineList[:-1]: 
    if line == lineList[-1]: 
     count += 1 

最後の行の各数値を確認する場合は、繰り返し回数を指定する必要があります。行を分割する必要があります。あなたの文字列にsplit関数を使うことができます。あなたは各行のブラケットを持っているので、ちょうど最初と最後の文字を削除し、注意してください:

last_line = lineList[-1][1:-1].split(" ") 
# This means, I want to split the last item of lineList 
# with the space character " " as a separator. Also, i don't 
# want the first and last character ([1:-1]) 

次にループで同じ操作を行います。

# Initialize an array of counters for each element in last_line 
counters = [0] * len(last_line) 
for line in lineList[:-1]: 
    line = line[1:-1].split(" ") 
    for i in range(len(last_line)): 
     if line[i] == last_line[i]: 
      counters[i] += 1 

その後、あなたは、ヒストグラムをプロットしたい場合は、そこを見てください:ここでhttps://matplotlib.org/devdocs/gallery/pyplots/pyplot_text.html#sphx-glr-gallery-pyplots-pyplot-text-py

https://matplotlib.org/devdocs/api/_as_gen/matplotlib.pyplot.hist.html#matplotlib.pyplot.hist

+0

このエラーが見つかりました:last_line = lineList [-1] [1:-1] .split( "") TypeError: 'str'はバッファインターフェイスをサポートしていません – tierrytestu

+0

次に、fileHandle = open( 'path_File' "rb")をfileHandle = open( 'path_File'、 "r")で置き換えます。バイナリモードでファイルをプレーンテキストで開く必要はありません。 –

関連する問題