重复调用set_axis_ticks无法按预期工作。
这是一个复制错误的示例。按下按钮Inc或Dec以增加组的数量,然后通过 set_axis_ticks 设置新的刻度标签。
您将看到标签文本已损坏。
当数据发生变化时,是否有另一种方法可以动态重新生成标签?
这是一个显示该问题的示例:
import dearpygui.dearpygui as dpg
import asyncio
import numpy as np
class BarPlot:
def __init__(self):
self.m = 5
self.n = 2
self.data = np.random.rand(self.n, self.m)
self.labels_coords = None
def offsets(self):
return (self.m + 1)*(np.cumsum(np.ones(self.n)) - 1)
def labels(self, offsets):
assert(len(offsets) == self.n)
texts = [f"Group {i}" for i in range(self.n)]
return tuple(zip(texts, list(offsets + self.m / 2)))
def update(self):
self.data = np.random.rand(self.n, self.m)
print(f"update {self.n}x{self.m} data:\n {self.data}")
offsets = self.offsets()
for i in range(self.m):
ys = list(self.data[:, i])
xs = list(offsets + i)
dpg.set_value(f"series-{i}", [xs, ys])
dpg.set_axis_ticks("x-axis", self.labels(offsets))
def on_inc(self, sender, app_data, user_data):
self.n += user_data
self.n = max(1, self.n)
self.update()
def render(self):
with dpg.group(horizontal=True):
dpg.add_button(label="Inc", callback=self.on_inc, user_data=1)
dpg.add_button(label="Dec", callback=self.on_inc, user_data=-1)
with dpg.plot(label="Bar Plot", width=700, height=400):
offsets = self.offsets()
dpg.add_plot_legend()
dpg.add_plot_axis(dpg.mvXAxis, label="X", tag="x-axis", no_gridlines=True)
dpg.set_axis_ticks("x-axis", self.labels(offsets))
with dpg.plot_axis(dpg.mvYAxis, label="Y", tag="y-axis"):
for i in range(self.m):
ys = self.data[:, i]
xs = offsets + i
dpg.add_bar_series(list(xs), list(ys), label=f"Series {i}", tag=f"series-{i}", weight=1)
dpg.set_axis_limits_auto("x-axis")
dpg.set_axis_limits_auto("y-axis")
bar_plot = BarPlot()
def render_gui():
with dpg.window(tag="main_window"):
dpg.add_spacer()
bar_plot.render()
def run():
dpg.create_context()
dpg.create_viewport(title='Bug', width=720, height=720)
render_gui()
dpg.setup_dearpygui()
dpg.show_viewport()
dpg.start_dearpygui()
dpg.destroy_context()
if __name__ == "__main__":
run()
最初一切都很好:
增加组数后:
这是错误还是set_axis_ticks的错误用法?
感谢您的任何帮助或建议。