2017-12-12 2 views
0

私は、グラフのすべての終点(曲線の最大値)を通り、csvファイルからプロットされた線分を描きたいと思います。この線分については、曲線上の1点(既知)を基準としてこの線分に平行な線を描く必要があります。ポイントを結んで線分を描き、平行線w.r.tを作る方法。線分?

z, x, y 
-40,0,0 
-40,0.658,26.443 
-40,1.316,47.128 
-40,1.974,62.084 
-40,2.632,73.336 
-40,3.29,81.785 
-40,3.948,87.501 
-40,4.606,90.795 
-40,5.264,92.491 
-40,5.922,93.231 
-40,6.58,93.41 - maximum value i.e end point of the curve 
23,0,0 
23,0.889,22.616 
23,1.778,36.552 
23,2.667,45.238 
23,3.556,50.666 
23,4.445,53.856 
23,5.334,55.673 
23,6.223,56.672 
23,7.112,57.203 
23,8.001,57.443 
23,8.89,57.51- maximum value i.e end point of the curve 
40,0,0 
40,0.937,19.191 
40,1.874,30.893 
40,2.811,38.58 
40,3.748,43.547 
40,4.685,46.518 
40,5.622,48.238 
40,6.559,49.193 
40,7.496,49.694 
40,8.433,49.935 
40,9.37,50.02- maximum value i.e end point of the curve 

上記は私がプロットする必要があるCSVファイルであり、終点は暗示されています。私はすべての終点をas in the imageという行でPandas関数を使って接続する必要があり、これを行うために以下のコードを試しました。例えば、平行線は任意の曲線上の単一点をとる。これは描画される線を指し、最初の線と平行でなければなりません。

import csv 
from tkinter import filedialog 
import pandas as pd 
import matplotlib.pyplot as plt 
import numpy as np 
from matplotlib import style 
from mpldatacursor import datacursor 

x=[] # Initializing empty lists to store the 3 columns in csv 
y=[] 
z=[] 
df = pd.DataFrame({'A' : []}) 

def readCSV(e): 
     global df 
     filename = filedialog.askopenfilename() 
     df = pd.read_csv(filename, error_bad_lines=False) #Reading CSV file using pandas 
     read = csv.reader(df, delimiter = ",") 
     fig = plt.figure() 
     data_list = [] 
     ax= fig.add_subplot(111) 
     df.set_index('x', inplace=True) #Setting index 
     df.groupby('z')['y'].plot(legend=True,ax=ax) #grouping and plotting 
     for line in ax.lines: 
      xdata = line.get_xdata() 
      ydata = line.get_ydata() 
      s = line.append([6.58,8.89,9.37]) 
      r = line.append([93.41,57.51,50.02]) 
     ax.plot(s,r) 
     ax.set_ylabel('y') 
     ax.set_xlabel('x') 
     ax.grid(True) 
     plt.show() 
+0

あなたをオフに開始するには - あなたがすることができますプロットした各行の最後の座標を取得します。 'for ax.lines:'、 'line.get_xdata()'のようにします。 yデータに対して繰り返し、これらの最後の値を新しいリストに追加します。これをプロットすると、既存の線の終わりを結ぶ直線が得られます – DavidG

+0

編集したプログラムを確認してください。それは正しい方法ですか? – Santo

答えて

0

グラフの端点を結ぶ線をプロットするには、各行の最後の座標を取得するのが良いでしょう。これは、get_xdata()get_ydata()を使用して行うことができます。これによりすべての値が返されますが、の最後の値はになります。これは、スライス表記[-1]を使用して行うことができます。

my_list = [1,2,3,4,5] 
print (my_list[-1]) 
# 5 

だからあなたのコードのようなものになるでしょう:与え

s = [] 
r = [] 

df = pd.read_csv("test.csv", error_bad_lines=False) #Reading CSV file using pandas 

fig = plt.figure() 
data_list = [] 
ax= fig.add_subplot(111) 
df.set_index('x', inplace=True) #Setting index 
df.groupby('z')['y'].plot(legend=True,ax=ax) #grouping and plotting 

for line in ax.lines: 
    s.append(line.get_xdata()[-1]) 
    r.append(line.get_ydata()[-1]) 

ax.plot(s, r, color="black", linestyle=":") 
ax.set_ylabel('y') 
ax.set_xlabel('x') 
ax.grid(True) 

plt.show() 

enter image description here

+0

素晴らしい!これは私がやろうとしていることであり、この行については、 '(m、n)'の距離で平行線を作りたいと思っています。それは一番最初の行のオフセットであるか、または2つの線の間の距離を見つけてその特定の座標でプロットすることによって最良の方法になります – Santo

+0

@サント私があなたの問題を解決したなら、それを受け入れることを検討するかもしれません。 [ここに記載されている](https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) – Simon

関連する問題