・Pythonを用いてcsvデータのグラフ描画を行いたいです。
・事前にRadiobuttonを用いてデータの種類を選択しておき、
それにあわせて軸や補助線の設定を変えたいです。
・補助線はcsvデータをデータフレームとして取り込んでいますが、
厄介なのは補助線の本数がデータによって違うことです。
if文で分岐させた中に設定部を取り込んだりしましたが、
うまくいかないです。おそらくmatplotlibの構造(というかオブジェクト指向自体も)
理解できていないことが原因かと思います。
・具体的には以下のコードの"補助線のデータセット"部のコメントアウトしている部分を
ifにより条件分岐させたいです。(Radiobuttonのflg1が2と3の際に適用したい)
また実際に描画する”補助線の描画”部も、それに合わせて分岐、追記が必要と思っています。
おそらく情報不足、認識違い等あると思いますので、その辺りもご指摘いただけたらと思います。
よろしくお願いいたします。
Python
1import tkinter as tk 2from tkinter import filedialog 3import matplotlib.pyplot as plt 4import pandas as pd 5from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg 6 7#ーーーーーーーーーーーーーーー初期処理ーーーーーーーーーーーーーーーー 8#tkをrootウィンドウに適用 9root = tk.Tk() 10# 画面サイズ 11root.geometry("525x375") 12# 画面タイトル 13root.title('Python GUI Test') 14 15#ラジオボタングループ用の変数 16#Variableの変数にボタン番号をセットでデフォルトのチェックを指定 17flg1 = tk.IntVar() 18flg1.set(0) 19 20#ーーーーーーーーーーーーーーー関数の宣言ーーーーーーーーーーーーーーー 21#… 22def file_select(): 23 idir = 'C:\python' #初期フォルダ 24 filetype = [("データ","*.csv"),("すべて","*")] #拡張子の選択 25 file_path = tkinter.filedialog.askopenfilename(filetypes = filetype, initialdir = idir) 26 input_box.insert(tkinter.END, file_path) #結果を表示 27 28#quit 29def cancel(): 30 root.destroy() 31 32#drow 33def drow(): 34 35 if flg1.get() == 0: 36 txt ="A" 37 df = pd.read_csv(r"C:\A1.csv",) 38 df_line = pd.read_csv(r"C:\A2.csv",) 39 x = 40 40 y = -25 41 42 elif flg1.get() == 1: 43 txt ="B" 44 df = pd.read_csv(r"C:B1.csv",) 45 df_line = pd.read_csv(r"C:\B2.csv",) 46 x = 20 47 y = -20 48 49 elif flg1.get() == 2: 50 txt ="C" 51 dfu = pd.read_csv(r"C:\Python\C1.csv",) 52 dfl = pd.read_csv(r"C:\Python\C2.csv",) 53 54 elif flg1.get() == 3: 55 txt ="D" 56 dfu = pd.read_csv(r"C:\Python\D1.csv",) 57 dfl = pd.read_csv(r"C:\Python\D2.csv",) 58 x = 160 59 y = -60 60 61 else: 62 txt ="undef" 63##ーーーーーーーーーーーーーーーグラフ設定ーーーーーーーーーーーーーーーー 64 #Figure = ノートのサイズ 65 #size × dpi = 解像度 66 fig = plt.figure(figsize=(10.0,4.8), 67 dpi = 100, 68 facecolor = 'w', 69 linewidth = '1', 70 edgecolor = 'grey' 71 ) 72 #subplot = 付箋のサイズ ↓縦横何分割したn番目に描画、グラフひとつなら111で良い 73 ax = fig.add_subplot(111, 74 #title = txt, 75 fc = 'w', 76 xlabel = 'Distance [m]', 77 xlim = (0,x), 78 ylabel = 'Relative_Velocity [km/h]', 79 ylim = (y,0), 80 ) 81 82 #plt.rcParamsはデフォルト設定のパラメータをオーバーライドできる 83 #目盛の配置 84 plt.rcParams["xtick.top"] = True 85 plt.rcParams["xtick.bottom"] = False 86 plt.rcParams["ytick.left"] = True 87 plt.rcParams["ytick.right"] = False 88 89 #spines = 枠線 90 ax.spines['top'].set_linewidth(1) 91 ax.spines['top'].set_color('grey') 92 ax.spines['right'].set_linewidth(1) 93 ax.spines['right'].set_color('grey') 94 ax.spines['left'].set_linewidth(1) 95 ax.spines['left'].set_color('gray') 96 ax.spines['bottom'].set_linewidth(1) 97 ax.spines['bottom'].set_color('grey') 98 99 #tick = 目盛のひげ 100 #ticklabel = 目盛ラベル デフォルトは左と下 101 ax.tick_params(direction='in', length=6, width=1, color='gray') 102 ax.tick_params(labeltop={True}) 103 ax.tick_params(labelbottom={}) 104 105 #grid = 罫線 106 ax.yaxis.grid(linestyle='--', lw=1, alpha=0.4, color='lightgray') 107 108#ーーーーーーーーーーーーーーー補助線のデータをセットーーーーーーーーーーーーーーーー 109 #AとBのときに引きたい 110 df2 = df[df["point"].isin([2])] 111 df2_5 = df[df["point"].isin([2.5])] 112 df3 = df[df["point"].isin([3])] 113 df3_5 = df[df["point"].isin([3.5])] 114 df4 = df[df["point"].isin([4])] 115 116 df_line2 = df_line[df_line["point"].isin([2])] 117 df_line2_5 = df_line[df_line["point"].isin([2.5])] 118 df_line3 = df_line[df_line["point"].isin([3])] 119 df_line3_5 = df_line[df_line["point"].isin([3.5])] 120 df_line4 = df_line[df_line["point"].isin([4])] 121 122 #CとDのときに引きたい 123 #df_u = df_u[df_u["point"].isin([u])] 124 #df_l = df_l[df_l["point"].isin([l])] 125 126 #ーーーーーーーーーーーーーーー補助線を描画ーーーーーーーーーーーーーーーー 127 plt.plot(df2['D'],df2['Vr'], 128 linewidth = 1, 129 linestyle = 'dashed', 130 color = 'dimgrey' 131 ) 132 133 plt.plot(df2_5['D'],df2_5['Vr'], 134 linewidth = 1, 135 linestyle = 'solid', 136 color = 'red' 137 ) 138 139 plt.plot(df3['D'],df3['Vr'], 140 linewidth = 1, 141 linestyle = 'dashed', 142 color = 'darkgrey' 143 ) 144 145 plt.plot(df3_5['D'],df3_5['Vr'], 146 linewidth = 1, 147 linestyle = 'solid', 148 color = 'red' 149 ) 150 151 plt.plot(df4['D'],df4['Vr'], 152 linewidth = 1, 153 linestyle = 'dashed', 154 color = 'dimgrey' 155 ) 156 157 plt.plot(df_line2['D'],df_line2['Vr'], 158 linewidth = 1, 159 linestyle = 'dashed', 160 color = 'dimgrey' 161 ) 162 163 plt.plot(df_line2_5['D'],df_line2_5['Vr'], 164 linewidth = 1, 165 linestyle = 'solid', 166 color = 'red' 167 ) 168 169 plt.plot(df_line3['D'],df_line3['Vr'], 170 linewidth = 1, 171 linestyle = 'dashed', 172 color = 'darkgrey' 173 ) 174 175 plt.plot(df_line3_5['D'],df_line3_5['Vr'], 176 linewidth = 1, 177 linestyle = 'solid', 178 color = 'red' 179 ) 180 181 plt.plot(df_line4['D'],df_line4['Vr'], 182 linewidth = 1, 183 linestyle = 'dashed', 184 color = 'dimgrey' 185 ) 186#CとDの時に引きたい 187 plt.plot(df_u['D'],df_u['Vr'], 188 linewidth = 1, 189 linestyle = 'solid', 190 color = 'dimgrey' 191 ) 192 plt.plot(df_l['D'],df_l['Vr'], 193 linewidth = 1, 194 linestyle = 'solid', 195 color = 'dimgrey' 196 ) 197 198 #ここからポップアップを描画していく 199 pltWindow = tk.Toplevel(root) 200 pltWin = FigureCanvasTkAgg(fig, master=pltWindow) 201 pltWin.get_tk_widget().grid(row=0, column=0, rowspan=10) 202 203 #rootに対しToplevelでポップアップ(pltWindow)作成 204 #pltWindowに対して(master=)、pltWinという名前でCanvas(描画)GUIを生成しfigを描く 205 #gridで配置する…無いと描画されない、謎 206 #とりあえずデータじゃなくて大枠描画 207 208 #CanvasにGUIを乗せる 209 pltWin.drow() 210 211#ーーーーーーーーーーーーーーーウィジェット描画ーーーーーーーーーーーーーーーー 212#参照ボタン 213button = tk.Button(text="…",command=file_select) 214button.place(x=300, y=245) 215 216#閉じるボタン 217button = tk.Button(text="quit",command=cancel) 218button.place(x=450, y=300) 219 220#描画ボタン 221button = tk.Button(text="drow",command=drow) 222button.place(x=50, y=300) 223 224#データ選択エントリ 225input_box = tk.Entry(width=25) 226input_box.place(x=50, y=250) 227 228#条件選択(ラジオボタン作成) 229chk1 = tk.Radiobutton(root, value=0 ,variable=flg1, text='A') 230chk1.place(x=50, y=50) 231 232chk2 = tk.Radiobutton(root, value=1 ,variable=flg1, text='B') 233chk2.place(x=50, y=100) 234 235chk3 = tk.Radiobutton(root, value=2 ,variable=flg1, text='C') 236chk3.place(x=50, y=150) 237 238chk4 = tk.Radiobutton(root, value=3 ,variable=flg1, text='D') 239chk4.place(x=50, y=200) 240#ーーーーーーーーーーーーーーーroot描画ーーーーーーーーーーーーーーーー 241root.mainloop()
あなたの回答
tips
プレビュー