0

重复调用set_axis_ticks无法按预期工作。

这是一个复制错误的示例。按下按钮IncDec以增加组的数量,然后通过 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的错误用法?

感谢您的任何帮助或建议。

4

1 回答 1

0

显然,看起来必须首先重置刻度。

在像这样设置新刻度之前添加重置

dpg.reset_axis_ticks("x-axis")
dpg.set_axis_ticks("x-axis", self.labels(offsets))

似乎完成了这项工作。

于 2022-02-11T03:55:54.377 回答