You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust中用egui、eframe、plotter实现多图表不重叠布局求助

解决egui-plotter多图表重叠问题

问题根源

TimeData::draw方法没有向egui正确声明自身的空间占用,导致egui认为图表未占据任何区域,后续UI元素(包括第二个图表)都会从同一顶部位置开始绘制,最终造成重叠。

解决方案

以下两种修改方式任选其一即可:

方式一:固定尺寸包裹图表

使用ui.add_sized为每个图表指定明确尺寸,让egui清楚每个图表的空间范围:

CentralPanel::default().show(ctx, |ui| {
    ui.with_layout(egui::Layout::top_down(egui::Align::TOP), |ui| {
        // 定义图表尺寸:宽度自适应面板,高度固定300
        let chart_size = egui::vec2(ui.available_width(), 300.0);
        
        // 绘制第一个图表
        ui.add_sized(chart_size, egui::Widget::wrap(&mut self.timechart));
        
        // 添加图表间的间距
        ui.add_space(20.0);
        
        // 绘制第二个图表
        ui.add_sized(chart_size, egui::Widget::wrap(&mut self.timechart1));
        
        // 若需第三个图表,重复上述步骤即可
        // ui.add_space(20.0);
        // ui.add_sized(chart_size, egui::Widget::wrap(&mut self.timechart2));
    });
});

方式二:手动分配空间绘制

如果需要更灵活地控制图表位置,可手动分配空间后在指定区域绘制:

CentralPanel::default().show(ctx, |ui| {
    let available_width = ui.available_width();
    let chart_height = 300.0;
    let spacing = 20.0;

    // 为第一个图表分配空间并绘制
    let chart_rect1 = ui.allocate_space(egui::vec2(available_width, chart_height));
    self.timechart.draw_in_rect(ui, chart_rect1);
    
    // 添加间距
    ui.add_space(spacing);
    
    // 为第二个图表分配空间并绘制
    let chart_rect2 = ui.allocate_space(egui::vec2(available_width, chart_height));
    self.timechart1.draw_in_rect(ui, chart_rect2);
    
    // 第三个图表同理
    // ui.add_space(spacing);
    // let chart_rect3 = ui.allocate_space(egui::vec2(available_width, chart_height));
    // self.timechart2.draw_in_rect(ui, chart_rect3);
});

补充说明

之前尝试的ui.separator()或ui.heading()无效,是因为egui未识别到图表的空间占用,这些元素被绘制在了图表上层区域,而非图表下方。通过上述方式让egui正确感知图表空间后,分隔元素就能正常显示在图表之间。

内容的提问来源于stack exchange,提问作者Keaton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 02:05:30