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軸の値を新しい値で置き換えて再描画できませんでした。
実際には正しく動作していないため、間違ったマーカーが頻繁に変更されます。そして、同じx軸で最初に2回プロットしようとすると、 'IndexError:インデックス1は、軸0のサイズが1の範囲外です。 ' –
' ch.index(x) 'を使うのが良いです。私は答えを更新しました。 – ImportanceOfBeingErnest
ありがとう!これは問題を解決しましたが、私はすでに別の方法で解決しました。 :) –