2017-12-16 9 views
0

x軸とy軸の値がx軸のスピンボックスの範囲が125〜8000の2つのtkinterスピンボックスから来るグラフをプロットする方法を理解するのは苦労していますy軸は-10〜125であり、スピンボックスによって提供された値に基づいてtkinterボタンが押されると、グラフの1つの点から他の点にプロットされます。tkinterボタンでpyplotメーカーの位置を更新する

サンプルコードである:ここでの問題は、それが特定のマーカーが同じx軸に既に存在するかどうかを確認する必要がある

from tkinter import * 

from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg 
from matplotlib.figure import Figure 
import numpy as np 
import collections 

class PlotClass(): 
    def __init__(self): 
     fig = Figure(figsize=(5,5),dpi=70,facecolor='cyan') 
     ax = fig.subplots() 
     ax.set_xlim(100,9000) 
     ax.set_ylim(130,-10) 

     x = [125,250,500,1000,2000,4000,8000] 
     ticks = [125,250,500,"1K","2K","4K","8K"] 
     xm = [750,1500,3000,6000] 

     ax.set_xscale('log', basex=2) 
     ax.set_xticks(x) 
     ax.set_xticks(xm, minor=True) 
     ax.set_xticklabels(ticks) 
     ax.set_xticklabels([""]*len(xm), minor=True) 

     ax.yaxis.set_ticks([120,110,100,90,80,70,60,50,40,30,20,10,0,-10]) 

     self.line2,= ax.plot([],[],'-o',markersize=15.0,mew=2) 
     ax.grid(color="grey") 
     ax.grid(axis="x", which='minor',color="grey", linestyle="--") 
     self.canvas = canvas = FigureCanvasTkAgg(fig, master=master) 
     canvas.show() 
     canvas.get_tk_widget().grid(column=0,row=2,columnspan=3,rowspan=15) 
     self.spin = Spinbox(master, from_=125,to=8000,command=self.action) 
     self.spin.grid(column=5,row=2) 

     self.spin2 = Spinbox(master, from_=-10,to=125,command=self.action) 
     self.spin2.grid(column=5,row=3) 

     self.button = Button(master, text="plot here",command=self.plot) 
     self.button.grid(column=5,row=4) 

    def linecreate(self, x=1000,y=20): 
     X,Y = self.line2.get_data() 
     if x in X: 
      ch = list(X) 
      counti = ch.count(x) 
      Y[counti] = y 
      print("Working") 
      print(Y) 
      self.canvas.draw_idle() 
     else: 
      X = np.append(X,[x]) 
      Y = np.append(Y,[y]) 
      self.line2.set_data(X,Y) 
      self.canvas.draw_idle() 


    def plot(self): 
     self.linecreate(float(self.spin.get()),float(self.spin2.get())) 

master = Tk() 
plotter = PlotClass() 
plotter.ok(125,10) 
master.mainloop() 

、それは一般的に、新しい値が追加された場所に新しい行をプロットしかし、私は、x軸の値が125でy軸に50のような値に一度プロットされた後、xが500、yが90でプロットするような方法が必要ですxに125をプロットし、yに20をプロットしようとすると、グラフにマーカーが作成されますが、新しいマーカーを作成せずに新しいY値で古いプロットを再描画する必要があります。

上記のコードでは、x軸が既にプロットされているかどうかをチェックしましたが、確認できましたが、Y軸の値を新しい値で置き換えて再描画できませんでした。

答えて

0

値が既に存在する場合は、self.line2.set_data(X,Y)でプロットを更新するのを忘れました。

def linecreate(self, x=1000,y=20): 
    X,Y = self.line2.get_data() 
    if x in X: 
     ch = list(X) 
     counti = ch.index(x) 
     Y[counti] = y   
    else: 
     X = np.append(X,[x]) 
     Y = np.append(Y,[y]) 
    self.line2.set_data(X,Y) 
    self.canvas.draw_idle() 
+0

実際には正しく動作していないため、間違ったマーカーが頻繁に変更されます。そして、同じx軸で最初に2回プロットしようとすると、 'IndexError:インデックス1は、軸0のサイズが1の範囲外です。 ' –

+0

' ch.index(x) 'を使うのが良いです。私は答えを更新しました。 – ImportanceOfBeingErnest

+0

ありがとう!これは問題を解決しましたが、私はすでに別の方法で解決しました。 :) –

関連する問題