BarChart mit Mathematica manipulieren

  • Im folgenden minimalen Arbeitsbeispiel:

     Manipulate[BarChart[{a,b}],{a,1,2},{b,1,2}]
     

    würde ich gerne Sie können die Größe der Balken steuern, indem Sie eine Art von Locator - Eigenschaft zum Bearbeiten verwenden, dh ändern Sie die vertikale Größe jedes Balkens, indem Sie meine Maus am Rand des Balkens platzieren (idealerweise irgendwo entlang der Breite).

    Offensichtlich funktioniert Locator nicht. Irgendwelche Ideen, wie das einfach geht?

    Ich möchte, dass der Wert des Balkendiagramms dynamisch aktualisiert wird. Im obigen Beispiel würde a, b einige Einschränkungen befolgen (wie a + b = 2. Wenn also einer den anderen ändert, muss dies der Fall sein.)

    ------- - Beantwortet --------

    Dies war so, dass einige mit den griechischen Parlamentswahlen spielen. Ich wollte mit den neuesten Umfrageergebnissen spielen und sie vor der Wahl am Sonntag variieren.

    @Mike Honeychurch: Sie haben Recht, Barspacing ändert nicht die Position des Locators, sondern die Locators sind nicht in der Mitte (dies ist meine Ausgabe, wenn ich Ihren Code ausführte):

    BarChart mit Mathematica manipulieren

    Ich gehe davon aus, dass Sie ausführen Eine andere Version von Mathematica als ich - ich laufe 7, sorry, hätte es sagen sollen. Also musste ich bei der Definition von pt mit den x-Koordinaten Ihrer Locators auf eine bestimmte Art und Weise arbeiten: numberofpoints = 5; barspacing = 0.1; xcoords = Table[i + barspacing i - 1/2, {i, 1, numberofpoints}]; pt = xcoords~Riffle~RandomInteger[{0, 3}, 3]~Partition~2

    Ich habe mir das Chart angesehen OK am Ende (Locators hier nur für die ersten drei Takte):

    BarChart mit Mathematica manipulieren

    war aber nicht ganz glücklich mit der Art und Weise, wie es wegen des oben erwähnten Geigens gemacht wurde. Ich gehe also mit dem Ansatz von @Heike, der aus dem Kasten heraus genau so arbeitet, wie ich es wollte:

     lastpoll = {{LightBlue, 24.3, "ΝΔ"}, {Green, 15.4, "ΠΑΣΟΚ"}, {Red, 10.9, "ΚΚΕ"}, 
    {Yellow, 8, "ΔΗΜΑΡ"}, { Pink, 9.5, "ΣΥΡΙΖΑ"}, {Blue, 9.6, "Αν. Ελληνες"},
    {Gray, 6.3, "Χρυση Αυγη"}, {LightBlue, 4.2, "ΛΑΟΣ"}, {Green, 4.4, "Οικολογοι"}, 
    {LightCyan, 2.1, "Δημ. Συμμαχια"}, {Yellow, .8, "ΕΠΑΜ"}, { LightRed, .8, "ΔΡΑΣΗ"},
    {Blue, .8, "ΑΝΤΑΡΣΥΑ"}, {LightGray, .8, "Κοιν. Συμφωνια"}, {White, 2, "Λοιπα"}};
    values = #[[2]] & /@ lastpoll;
    dragBar[values, 
    ChartLabels -> Placed[(Last /@ lastpoll), Axis, Rotate[#, 55 Degree] &], 
     ChartStyle - & gt; (Erster / @ letzter Poll), BarSpacing - & gt; .6, ImageSize - & gt; Large] 
      

    mit folgendem Ergebnis (alles fummelbar):

    BarChart mit Mathematica manipulieren

    Vielen Dank, dass Sie sich die Zeit genommen haben. Das war schwieriger als ich erwartet hatte.

    04 May 2012
    gpap
4 answers
  • Hier ist etwas, das alle Kästchen ankreuzt (glaube ich).

    1. Sie verwenden Locators, um die Höhe des zu ändern Bars

    2. Sie haben ein BarChart und können es nach Ihren Wünschen gestalten.

    3. die Die Steuerung des Locators wird auf jeden Balken zentriert.

    4. Die Summe der Höhen ist beschränkt - in diesem Fall summieren sie sich auf 5.

    Lassen Sie mich wissen, ob Sie danach suchen:

     DynamicModule[{pt = {{1, 3}, {2, 2}}, tmp, sum = 5},
    
     LocatorPane[
      Dynamic[pt, (tmp = #; 
         pt = {{1, sum - tmp[[2, 2]]}, {2, sum - tmp[[1, 2]]}}) &],
    
      Dynamic@BarChart[{pt[[1, 2]], pt[[2, 2]]},
        PerformanceGoal -> "Speed",
        PlotRange -> {{0.3, 2.5}, {0, 5}}]
      ]
     ]
     

    BarChart mit Mathematica manipulieren

    Bearbeiten

    BarSpacing hat keine Auswirkung auf die Locator-Positionierung:

     DynamicModule[{pt = {{1, 3}, {2, 2}, {3, 3}}, tmp},
    
     LocatorPane[Dynamic[pt, (tmp = #;
         pt = {{1, tmp[[1, 2]]}, {2, tmp[[2, 2]]}, {3, tmp[[3, 2]]}}) &],
    
      Dynamic@BarChart[{pt[[1, 2]], pt[[2, 2]], pt[[3, 2]]},
        BarSpacing -> Large,
        PerformanceGoal -> "Speed",
        PlotRange -> {{0.3, 3.5}, {0, 5}}]
      ]
     ]
     

    BarChart mit Mathematica manipulieren

    04 May 2012
    Darren Kopp
  • Hier ist eine weitere Skizze:

     DynamicModule[{a, b, ab, val},
     {a, b} = {1, 1};
     ab[{x_, y_}] := Which[
       0.2 <= x <= 1.2, {a = y, b = 2 - a},
       1.2 <= x <= 2.4, {a = 2 - y, b = y},
       True, {a, b}
       ];
     Dynamic@BarChart[{val = ab@MousePosition["Graphics", {0, 0}]},
       PlotRange -> {-10, 10},
       BarSpacing -> None,
       ChartLabels -> {val}
       ]
     ]
     

    Das Diagramm ändert sich dynamisch, wenn Sie sich über die Balken bewegen , keine Notwendigkeit zu klicken. Die Abhängigkeit a+b=2 wird ebenfalls implementiert.

    BarChart mit Mathematica manipulieren

    02 May 2012
    Rudd Zwolinski
  • Hier ist mein Versuch. Es stellte sich heraus, dass es schwierig war, die Höhe eines Balkens nur dann zu ändern, wenn sich der Mauszeiger nahe genug am oberen Rand befindet. Standardmäßig muss der vertikale Abstand zwischen dem Mauszeiger und dem oberen Rand kleiner als 0,5 sein, um die Leiste ziehen zu können. Sie können diesen Wert ändern, indem Sie die Option "resolution" setzen.

    Ich habe auch die Einschränkung implementiert, dass die Summe der Höhen konstant ist. Wenn ein Balken gezogen wird, ändern sich die Höhen der anderen Balken, um die Gesamthöhe konstant zu halten.

    Beachten Sie, dass dragBar jede Option von BarChart akzeptiert, sodass Sie alle Funktionen von BarChart verwenden können.

     SetAttributes[dragBar, HoldFirst];
    Options[dragBar] = Append[Options[BarChart], "resolution" -> .5];
    
    dragBar[values_, opt : OptionsPattern[dragBar]] := 
     DynamicModule[{widths, ind, pt = {0, 0}, index},
      widths = Reap[BarChart[ConstantArray[1, Length[values]], 
          ChartElementFunction :> ((If[Head[#1] === List, Sow[#1[[1]]]];) &), 
          FilterRules[{opt}, Options[BarChart]]]][[2, 1]];
      ind[x_] := Piecewise[
        Table[{i, widths[[i, 1]] < x < widths[[i, 2]]}, {i, Length[widths]}], 0];
    
      LocatorPane[Dynamic[pt,
        {(index = ind[#[[1]]]; 
          If[index == 0 || Abs[#[[2]] - values[[index]]] > OptionValue["resolution"], 
            index = None]) &,
         (If[IntegerQ[index],
            values += (values[[index]] - #[[2]])/(Length[values] - 1);
            values[[index]] = #[[2]]]) &,
         None}],
       Dynamic[BarChart[values, FilterRules[{opt}, Options[BarChart]]]], Appearance -> None]]
    
    values = RandomInteger[10, 10];
    dragBar[values, BarSpacing -> .6]
     

    BarChart mit Mathematica manipulieren

    04 May 2012
    EAMannAndrew
  • Gibt Ihnen die Grundlage für eine Lösung:

     Manipulate[
     Framed@Graphics[{Red, Rectangle[{0, 0}, {1, Last@p}], Blue, 
        Rectangle[{1.1, 0}, {2.1, Last@q}]}], {{p, {1, 1}}, 
      Locator}, {{q, {1.1, 2}}, Locator}]
     

    BarChart mit Mathematica manipulieren

    02 May 2012
    image_doctor