61625


下記の過去質問に関連したプログラムです。

[matplotlibの表示について](https://ja.stackoverflow.com/q/61505/19110)

10種類のテキストファイルを読み込んで、`[]` の格納して表示するプログラムとなっています。  
データは今（X、Z）の二次元配列です。

[code]

    import matplotlib.pyplot as plt
    import os
    import tkinter
    from tkinter import messagebox
    from tkinter import filedialog
    
    root = tkinter.Tk()
    root.title('微小山') #タイトル
    root.geometry('400x200') #サイズ 横x縦
    
    messagebox.showinfo('select','測定データ')
    fileType = [('テキストァイル','*.txt')] #ファイルタイプを指定
    iniDir1 = os.path.abspath(os.path.dirname(__file__)) #初期表示フォルダ
    filepath1 = filedialog.askopenfilename(filetypes=fileType,initialdir = iniDir1)
    messagebox.showinfo('選択したファイル',filepath1)
    
    fileType = [('テキストァイル','*.txt')] #ファイルタイプを指定
    iniDir2 = os.path.abspath(os.path.dirname(__file__)) #初期表示フォルダ
    filepath2 = filedialog.askopenfilename(filetypes=fileType,initialdir = iniDir2)
    messagebox.showinfo('選択したファイル',filepath2)
    
    fileType = [('テキストァイル','*.txt')] #ファイルタイプを指定
    iniDir3 = os.path.abspath(os.path.dirname(__file__)) #初期表示フォルダ
    filepath3 = filedialog.askopenfilename(filetypes=fileType,initialdir = iniDir3)
    messagebox.showinfo('選択したファイル',filepath3)
    
    fileType = [('テキストァイル','*.txt')] #ファイルタイプを指定
    iniDir4 = os.path.abspath(os.path.dirname(__file__)) #初期表示フォルダ
    filepath4 = filedialog.askopenfilename(filetypes=fileType,initialdir = iniDir4)
    messagebox.showinfo('選択したファイル',filepath4)
    
    fileType = [('テキストァイル','*.txt')] #ファイルタイプを指定
    iniDir5 = os.path.abspath(os.path.dirname(__file__)) #初期表示フォルダ
    filepath5= filedialog.askopenfilename(filetypes=fileType,initialdir = iniDir5)
    messagebox.showinfo('選択したファイル',filepath5)
    
    fileType = [('テキストァイル','*.txt')] #ファイルタイプを指定
    iniDir6 = os.path.abspath(os.path.dirname(__file__)) #初期表示フォルダ
    filepath6 = filedialog.askopenfilename(filetypes=fileType,initialdir = iniDir6)
    messagebox.showinfo('選択したファイル',filepath6)
    
    fileType = [('テキストァイル','*.txt')] #ファイルタイプを指定
    iniDir7 = os.path.abspath(os.path.dirname(__file__)) #初期表示フォルダ
    filepath7 = filedialog.askopenfilename(filetypes=fileType,initialdir = iniDir7)
    messagebox.showinfo('選択したファイル',filepath7)
    
    fileType = [('テキストァイル','*.txt')] #ファイルタイプを指定
    iniDir8 = os.path.abspath(os.path.dirname(__file__)) #初期表示フォルダ
    filepath8 = filedialog.askopenfilename(filetypes=fileType,initialdir = iniDir8)
    messagebox.showinfo('選択したファイル',filepath8)
    
    fileType = [('テキストァイル','*.txt')] #ファイルタイプを指定
    iniDir9 = os.path.abspath(os.path.dirname(__file__)) #初期表示フォルダ
    filepath9 = filedialog.askopenfilename(filetypes=fileType,initialdir = iniDir9)
    messagebox.showinfo('選択したファイル',filepath9)
    
    fileType = [('テキストァイル','*.txt')] #ファイルタイプを指定
    iniDir10 = os.path.abspath(os.path.dirname(__file__)) #初期表示フォルダ
    filepath10 = filedialog.askopenfilename(filetypes=fileType,initialdir = iniDir10)
    
    
    messagebox.showinfo('選択したファイル',filepath10)
    
    
    #list = [filepath]
    #for i in range(len(list)):
      # list_item = list[i]
    
    root.destroy()    
    root.mainloop()
    
    x1_list=[] # data1格納用のx_listを定義
    z1_list=[] # data1格納用のz_listを定義
    x2_list=[] # data2格納用のx_listを定義
    z2_list=[] # data2格納用のz_listを定義
    x3_list=[] # data2格納用のx_listを定義
    z3_list=[] # data2格納用のz_listを定義
    x4_list=[] # data2格納用のx_listを定義
    z4_list=[] # data2格納用のz_listを定義
    x5_list=[] # data2格納用のx_listを定義
    z5_list=[] # data2格納用のz_listを定義
    x6_list=[] # data2格納用のx_listを定義
    z6_list=[] # data2格納用のz_listを定義
    x7_list=[] # data2格納用のx_listを定義
    z7_list=[] # data2格納用のz_listを定義
    x8_list=[] # data2格納用のx_listを定義
    z8_list=[] # data2格納用のz_listを定義
    x9_list=[] # data2格納用のx_listを定義
    z9_list=[] # data2格納用のz_listを定義
    x10_list=[] # data2格納用のx_listを定義
    z10_list=[] # data2格納用のz_listを定義
    #x11_list=[] # data2格納用のx_listを定義
    #z11_list=[] # data2格納用のz_listを定義
    
    f1=open(filepath1) 
    f2=open(filepath2) 
    f3=open(filepath3) 
    f4=open(filepath4) 
    f5=open(filepath5) 
    f6=open(filepath6) 
    f7=open(filepath7) 
    f8=open(filepath8) 
    f9=open(filepath9) 
    f10=open(filepath10) 
    #f11=open(1, list_item) 
    
    #data1読み込み
    for line in f1:
        data1 = line[:-1].split(' ')
        x1_list.append(float(data1[0]))
        z1_list.append(float(data1[1]))
    #data２読み込み
    for line in f2:
        data2 = line[:-1].split(' ')
        x2_list.append(float(data2[0]))
        z2_list.append(float(data2[1]))
    
    for line in f3:
        data3 = line[:-1].split(' ')
        x3_list.append(float(data3[0]))
        z3_list.append(float(data3[1]))
    
    for line in f4:
        data4 = line[:-1].split(' ')
        x4_list.append(float(data4[0]))
        z4_list.append(float(data4[1]))
    
    for line in f5:
        data5 = line[:-1].split(' ')
        x5_list.append(float(data5[0]))
        z5_list.append(float(data5[1]))
    
    for line in f6:
        data6 = line[:-1].split(' ')
        x6_list.append(float(data6[0]))
        z6_list.append(float(data6[1]))
    
    for line in f7:
        data7 = line[:-1].split(' ')
        x7_list.append(float(data7[0]))
        z7_list.append(float(data7[1]))
    
    for line in f8:
        data8 = line[:-1].split(' ')
        x8_list.append(float(data8[0]))
        z8_list.append(float(data8[1]))
    
    for line in f9:
        data9 = line[:-1].split(' ')
        x9_list.append(float(data9[0]))
        z9_list.append(float(data9[1]))
    
    for line in f10:
        data10 = line[:-1].split(' ')
        x10_list.append(float(data10[0]))
        z10_list.append(float(data10[1]))
    
    #for line in f11:
       # data11 = line[:-1].split(' ')
       # x11_list.append(float(data11[0]))
        #z11_list.append(float(data11[1]))
    
    min_z = min(z1_list)
    max_z = max(z1_list)
    
    tmin = min(z2_list)
    if tmin < min_z:
        min_z = tmin
    
    tmax = max(z2_list)
    if tmax > max_z:
        max_z = tmax
    
    tmin = min(z3_list)
    if tmin < min_z:
        min_z = tmin
    
    tmax = max(z3_list)
    if tmax > max_z:
        max_z = tmax
    
    tmin = min(z4_list)
    if tmin < min_z:
        min_z = tmin
    
    tmax = max(z4_list)
    if tmax > max_z:
        max_z = tmax
    
    tmin = min(z5_list)
    if tmin < min_z:
        min_z = tmin
    
    tmax = max(z5_list)
    if tmax > max_z:
        max_z = tmax
    
    tmin = min(z6_list)
    if tmin < min_z:
        min_z = tmin
    
    tmax = max(z6_list)
    if tmax > max_z:
        max_z = tmax
    
    tmin = min(z7_list)
    if tmin < min_z:
        min_z = tmin
    
    tmax = max(z7_list)
    if tmax > max_z:
        max_z = tmax
    
    tmin = min(z8_list)
    if tmin < min_z:
        min_z = tmin
    
    tmax = max(z8_list)
    if tmax > max_z:
        max_z = tmax
    
    tmin = min(z9_list)
    if tmin < min_z:
        min_z = tmin
    
    tmax = max(z9_list)
    if tmax > max_z:
        max_z = tmax
    
    tmin = min(z10_list)
    if tmin < min_z:
        min_z = tmin
    
    tmax = max(z10_list)
    if tmax > max_z:
        max_z = tmax
    
    #tmin = min(z11_list)
    #if tmin < min_z:
    #    min_z = tmin
    
    #tmax = max(z11_list)
    #if tmax > max_z:
     #   max_z = tmax
    
    
    ##
    plt.xlabel('X') # ｘ軸のラベル
    plt.ylabel('Z') # y軸のラベル
    
    plt.plot(x1_list, z1_list, color="red", alpha=0.8, linewidth=2.0, label="data1")
    plt.plot(x2_list, z2_list, color="red", alpha=0.8, linewidth=2.0, label="data2")
    plt.plot(x3_list, z3_list, color="red", alpha=0.8, linewidth=2.0, label="data3")
    plt.plot(x4_list, z4_list, color="red", alpha=0.8, linewidth=2.0, label="data4")
    plt.plot(x5_list, z5_list, color="red", alpha=0.8, linewidth=2.0, label="data5")
    plt.plot(x6_list, z6_list, color="red", alpha=0.8, linewidth=2.0, label="data6")
    plt.plot(x7_list, z7_list, color="red", alpha=0.8, linewidth=2.0, label="data7")
    plt.plot(x8_list, z8_list, color="red", alpha=0.8, linewidth=2.0, label="data8")
    plt.plot(x9_list, z9_list, color="red", alpha=0.8, linewidth=2.0, label="data9")
    plt.plot(x10_list, z10_list, color="red", alpha=0.8, linewidth=2.0, label="data10")
    #plt.plot(x11_list, z11_list, color="red", alpha=0.8, linewidth=2.0, label="data11")
    
    plt.legend()
    
    plt.xticks(fontsize=10)
    plt.yticks(fontsize=10) 
    plt.ylim([min_z - 0.02, max_z + 0.02])
    plt.grid(True) #グラフの枠を作成
    fig = plt.figure()
    plt.subplots_adjust(wspace=0.3, hspace=0.6)
    plt.show()    # 描画結果を出力する。必ず書く。
    
[/code]

一例テキストファイルの二次元表示

[![画像の説明をここに入力](https://i.stack.imgur.com/Vekfw.png)](https://i.stack.imgur.com/Vekfw.png)

これらのデータを奥行方向に繋げることはできないかと思い、似たような事を質問されている方をみつけました：[jupyter python アニメーション
点と点を繋ぐ線の作成](https://teratail.com/questions/202453)。  
こちらの方のように動かす必要はないのですが、三次元は扱ったことがないので、どなたかご教授下さい。

実現したいこと

[![画像の説明をここに入力](https://i.stack.imgur.com/GHzfu.jpg)](https://i.stack.imgur.com/GHzfu.jpg)


CC BY-SA 4.0
2019-12-20T09:23:50.123
61618
2019-12-25T13:29:32.293
2019-12-20T12:59:54.940
3060
36532
question
python matplotlib
三次元で点と点を繋げるには？


以下のようなコードでできます。

[code]

    #!/usr/bin/env python
    
    import matplotlib.pyplot as plt
    from mpl_toolkits.mplot3d import axes3d
    import numpy as np
    
    # サンプルデータを作る
    
    x1 = [ x for x in range(5) ]
    z1 = [ z % 2 + 0.0 for z in range(5) ]
    
    x2 = [ x for x in range(5) ]
    z2 = [ z % 2 + 0.5 for z in range(5) ]
    
    x3 = [ x for x in range(5) ]
    z3 = [ z % 2 + 1.0 for z in range(5) ]
    
    # list にまとめる
    xs = [x1, x2, x3]
    zs = [z1, z2, z3]
    
    # ここから描画
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d', xlabel='X', ylabel='seq#', zlabel='Z')
    
    # 青線を一本ずつ描画
    for i in range(3):
        ax.plot_wireframe(np.array([xs[i]], np.float32),
                          np.array([[i + 1 for _ in range(5)]], np.float32),
                          np.array([zs[i]], np.float32), color='blue')
    
    # 赤線を一本ずつ描画
    for i in range(5):
        ax.plot_wireframe(np.array([[x1[i], x2[i], x3[i]]], np.float32),
                          np.array([[1, 2, 3]], np.float32),
                          np.array([[z1[i], z2[i], z3[i]]], np.float32), color='red')
    
    plt.show()
    
[/code]

`add_subplot` に `projection='3d'` を渡すことで 3D になります。これで得た `ax` に対して  
`plot_wireframe` で線を一本ずつ描いていくと良いでしょう。

ただし、`plot_wireframe`
は、[このチュートリアル](https://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html)の
Wireframe plots にあるような図を描くためのもので、従って、与えるデータは2次元配列です。  
今回は1本ずつしか書かないので、1次元配列を1つだけ持つ配列、としました。

全部同じ色で良ければ別な書き方もできますが、横方向と奥行き方向で色を分けるなら一本ずつ描くしかなさそうでした。

[![描画結果](https://i.stack.imgur.com/2dOme.png)](https://i.stack.imgur.com/2dOme.png)

* * *

追記。

同じ色で良いのでしたら、以下のように書けます。

[code]

    #!/usr/bin/env python
    
    import matplotlib.pyplot as plt
    from mpl_toolkits.mplot3d import axes3d
    import numpy as np
    
    # サンプルデータ
    
    x1 = [ x for x in range(5) ]
    z1 = [ z % 2 + 0.0 for z in range(5) ]
    
    x2 = [ x for x in range(5) ]
    z2 = [ z % 2 + 0.5 for z in range(5) ]
    
    x3 = [ x for x in range(5) ]
    z3 = [ z % 2 + 1.0 for z in range(5) ]
    
    # list にまとめる
    xs = [x1, x2, x3]
    zs = [z1, z2, z3]
    
    # 2次元配列に並び替える
    # X軸: 右向き (x_list)
    # Y軸: 奥向き (系列番号)
    # Z軸: 上向き (z_list)
    X = [ [ xs[i_y][i_x] for i_x in range(5) ] for i_y in range(3) ]
    Y = [ [    i_y       for i_x in range(5) ] for i_y in range(3) ]
    Z = [ [ zs[i_y][i_x] for i_x in range(5) ] for i_y in range(3) ]
    
    # numpy array に変換
    X = np.array(X, np.float32)
    Y = np.array(Y, np.float32)
    Z = np.array(Z, np.float32)
    
    # 描画
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d', xlabel='X', ylabel='seq#', zlabel='Z')
    ax.plot_wireframe(X, Y, Z)
    
    plt.show()
    
[/code]

`X`, `Y`, `Z` はそれぞれ二次元配列です。  
`i_x` は X 軸方向の何番目の点かを表していて、`i_y` は系列番号です。  
二次元配列 `X`, `Y`, `Z` の値は、各点の X座標, Y座標, Z座標です。

これらの二次元配列を `ax.plot_wireframe()` に渡して、まとめて描くことができます。

[![まとめて描く場合](https://i.stack.imgur.com/UVbdM.png)](https://i.stack.imgur.com/UVbdM.png)


CC BY-SA 4.0
2019-12-20T16:57:06.010
61625
2019-12-25T13:29:32.293
2019-12-25T13:29:32.293
5288
5288
61618
answer