--- name: bar_chart kind: component lang: cpp domain: viz version: "1.1.0" purity: pure signature: "void bar_chart(const char* title, const char* const* labels, const float* values, int count, float bar_width = 0.67f, float height = 200.0f)" description: "Renderiza un grafico de barras verticales con ImPlot, ejes pineados (Lock + Cond_Always) y altura explicita para evitar feedback loops visuales" tags: [implot, chart, visualization, gpu, bar, locked-axes] uses_functions: [] uses_types: [] returns: [] returns_optional: false error_type: "" imports: [implot] tested: false tests: [] test_file_path: "" file_path: "cpp/functions/viz/bar_chart.cpp" framework: imgui params: - name: title desc: "Titulo del grafico de barras (tambien se usa como id interno del plot)" - name: labels desc: "Array de etiquetas para el eje X, una por barra" - name: values desc: "Array de valores numericos para la altura de cada barra" - name: count desc: "Numero de barras (longitud de labels y values)" - name: bar_width desc: "Ancho de cada barra como fraccion del hueco de celda (default 0.67)" - name: height desc: "Altura del plot en pixeles (default 200). Explicita para evitar feedback loops con contenedores AutoResizeY" output: "Renderiza el grafico de barras en el frame ImGui actual con ejes X/Y pineados" --- # bar_chart Barras verticales con ImPlot, pensado para dashboards estaticos (resumenes, KPIs). Diseno: - **Ejes pineados** — `ImPlotCond_Always` + `ImPlotAxisFlags_Lock` + `ImPlotAxisFlags_NoInitialFit`. Sin esto, ImPlot auto-fitea cada frame y las barras oscilan los primeros frames. - **Y max con 15% de headroom** — calculado a partir de `values` una vez, mas estetico que el fit apretado de ImPlot. - **Altura explicita** — `ImVec2(-1, height)` en vez de `ImVec2(-1, 0)`. Dentro de un `dashboard_panel` (BeginChild con AutoResizeY), un height=0 crea un feedback loop: el plot pide espacio al padre, el padre se redimensiona al plot, el plot recalcula y asi. El efecto visual es que las barras se deslizan de lado al abrir la ventana. Con height fija no hay loop. - **Sin inputs** — `ImPlotFlags_NoInputs | NoFrame | NoBoxSelect | NoMouseText`. Pensado para visualizacion, no exploracion. Debe llamarse dentro del render callback de `fn::run_app`. ## Ejemplo ```cpp const char* langs[] = {"go", "py", "ts", "sh", "cpp"}; float counts[] = {412, 187, 94, 63, 36}; bar_chart("Functions by lang", langs, counts, 5); // height por defecto 200 bar_chart("Compact", langs, counts, 5, 0.8f, 120.0f); // compacto ```