• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

Bunte D/T-Matrix

flopp

Geomaster
Hallo,

ich mal ein bisschen mit der Statistikseite rumgespielt. Herausgekommen ist eine D/T-Matrix mit "Farbverlauf" (D/T-Kombination mit der höchsten Fundzahl = rot, niedrigste Fundzahl = gelb, dazwischen wird linear interpoliert). Wer wissen will, wie das aussieht, kann auf meiner Geolog-Statistikseite nachschauen.

Hier kommt der Code der veränderten dtmat.incl-Datei. Aber Achtung, nicht erschrecken: ich habe bisher noch nie etwas in Perl geschrieben!

Code:
##eval(
sub scale_color
{
    my($value,$min_value,$max_value,$delta_value,$min_r,$min_g,$min_b,$max_r,$max_g,$max_b,$r,$g,$b,$color);

    $value=$_[0];
    $min_value=$_[1];
    $max_value=$_[2];
    $delta_value=($value-$min_value)/($max_value-$min_value);
    $min_r=$_[3];
    $min_g=$_[4];
    $min_b=$_[5];
    $max_r=$_[6];
    $max_g=$_[7];
    $max_b=$_[8];
    
    $r=int($min_r + $delta_value*($max_r-$min_r));
    $g=int($min_g + $delta_value*($max_g-$min_g));
    $b=int($min_b + $delta_value*($max_b-$min_b));

    $color = sprintf( "#%02x%02x%02x", $r, $g, $b );
    return $color;
}

sub dtmat_color {
  my(%dvals,%tvals,%dtvals);
  my($text,$d,$t,$c,$dtmax,$dtmin,$dmax,$tmax,$dsum,$tsum,$min_value,$max_value);
  $dsum = 0;
  $tsum = 0;
  foreach (keys(%found)) {
    $dvals{$found{$_}->{'Difficulty'}}++;
    $dsum += $found{$_}->{'Difficulty'};
    $tvals{$found{$_}->{'Terrain'}}++;
    $tsum += $found{$_}->{'Terrain'};
    $dtvals{$found{$_}->{'Difficulty'} . "|" . $found{$_}->{'Terrain'}}++;
  }
  foreach (keys(%dvals)) {
    $dmax = $_ if ($dvals{$dmax} < $dvals{$_});
  }
  foreach (keys(%tvals)) {
    $tmax = $_ if ($tvals{$tmax} < $tvals{$_});
  }
  foreach (keys(%dtvals)) {
    $dtmax = $_ if ($dtvals{$dtmax} < $dtvals{$_});
  }
  foreach (keys(%dtvals)) {
    $dtmin = $_ if ($dtvals{$dtmin} > $dtvals{$_});
  }
  $max_value = $dtvals{$dtmax};
  $min_value = $dtvals{$dtmin};

  $text = "";
  foreach $d ((1,1.5,2,2.5,3,3.5,4,4.5,5)) {
    $text .= "\n <tr>";
    $text .= "\n  <th class='statistics'>$d</th>";
    foreach $t ((1,1.5,2,2.5,3,3.5,4,4.5,5)) {
      if (($c = $dtvals{ $d . "|" . $t }) != 0) {
	$text .= "\n  <td class='statistics'  style='text-align:center;color:black;background:" . scale_color($c, $min_value, $max_value, 255,255,0, 255,0,0) . "'>";
        $text .= "$c";
	$text .= "</td>";
      } else {
	$text .= "\n  <td class='statistics'> </td>";
      }
    }
    $c = $dvals{$d};
    $text .= "\n  <td class='statistics'  style='text-align:right'>";
    $text .= "<font color='red'>" if ($dvals{$dmax} == $c);
    $text .= "$c";
    $text .= "</font>" if ($dvals{$dmax} == $c);
    $text .= "</td>";
    $text .= "\n </tr>";

  }
  $text .= "\n <tr>";
  $text .= "\n  <td class='statistics'  style='text-align:right'> </td>";

  foreach $t ((1,1.5,2,2.5,3,3.5,4,4.5,5)) {
    $c = $tvals{$t};
    $text .= "\n  <td class='statistics'  style='text-align:right'>";
    $text .= "<font color='red'>" if ($tvals{$tmax} == $c);
    $text .= "$c";
    $text .= "</font>" if ($tvals{$tmax} == $c);
    $text .= "</td>";
  }
  $text .= "\n  <td class='statistics'  style='text-align:right'> </td>";
  $text .= "\n </tr>";
  $text .= "\n <tr>\n  <td class='statistics'  style='text-align:center' colspan='12'>";
  $text .= scalar(keys(%dtvals)) . " von 81 möglichen D/T-Kombinationen gefunden, ";
  $text .= "arithmetisches Mittel der D/T-Werte: " . 
    sprintf("%1.2f",$dsum/scalar(keys(%found))) . 
      "/" .  sprintf("%1.2f",$tsum/scalar(keys(%found)));
  $text .= "\n  </td>\n </tr>\n";
      
  return($text);
})##
<table class="statistics">
  <caption class="statistics">Schwierigkeits/Gelände-Matrix</caption>
  <tr>
    <th class="statistics"> </th>
    <th colspan="10"  class="statistics">Gelände</td>
    <th  class="statistics"> </th>
   </tr>
   <tr>
     <th rowspan="11" class="statistics" width="12%">Schwierigkeit</td>
     <th  class="statistics" width="8%"> </th>
     <th  class="statistics" width="8%">1</th>
     <th  class="statistics" width="8%">1.5</th>
     <th  class="statistics" width="8%">2</th>
     <th  class="statistics" width="8%">2.5</th>
     <th  class="statistics" width="8%">3</th>
     <th  class="statistics" width="8%">3.5</th>
     <th  class="statistics" width="8%">4</th>
     <th  class="statistics" width="8%">4.5</th>
     <th  class="statistics" width="8%">5</th>
     <th  class="statistics" width="8%">  </th>
   </tr>
##eval(dtmat_color())##
</table>
 

AndiOlli

Geocacher
Wow, die sieht ja wirklich super aus. Werd ich heut abend gleich mal bei meiner Statistik anwenden, mal schauen wie es dort aussieht.

Muss ich den kompletten Code hier in der Datei dtmat.incl nur hinzufügen oder ersetzen?
 
OP
F

flopp

Geomaster
AndiOlli schrieb:
Wow, die sieht ja wirklich super aus. Werd ich heut abend gleich mal bei meiner Statistik anwenden, mal schauen wie es dort aussieht.

Muss ich den kompletten Code hier in der Datei dtmat.incl nur hinzufügen oder ersetzen?

Du kannst den Code auch in eine neue Datei im Statistikverzeichnis schreiben, z.B. "statistics/dtmat_color.impl". In der Datei "stat.tmpl" kannst du dann die neue Datei includen.
 

AndiOlli

Geocacher
flopp schrieb:
Du kannst den Code auch in eine neue Datei im Statistikverzeichnis schreiben, z.B. "statistics/dtmat_color.impl". In der Datei "stat.tmpl" kannst du dann die neue Datei includen.

Danke für die rasche Antwort, dann werd ich das so machen, dann habe ich quasi die Auswahl, welche ich dann nehme und hab die alte zur Sicherheit immer noch.
 

eilinger

Geocacher
Ich habe bei mir noch die Umlaute durch entsprechende
HTML Tags ersetzt (z.B. ä durch ä usw.). Ich sonst
an diesen Stellen Darstellungsfehler.

Grüße
eilinger
 

MacDefender

Geocacher
Hey, das sieht wirklich sehr hübsch aus :)
Ich würde diese Art der Darstellung gerne in mein Programm GCStatistic mit übernehmen. Evtl. kann man die Matrix ja sogar passend zu den Cachetypen einfärben die man dann über der Matrix aus einer Liste 8Alle, Tradi, Multi...) auswählen kann. Müsste mit etwas CSS/Javascript etc. ja machbar sein. Dann könnte man auch gucken ob man bei bestimmten Cachearten vorlieben fürs Terrain oder Difficulty hat.
 
OP
F

flopp

Geomaster
MacDefender schrieb:
Hey, das sieht wirklich sehr hübsch aus :)
Ich würde diese Art der Darstellung gerne in mein Programm GCStatistic mit übernehmen. Evtl. kann man die Matrix ja sogar passend zu den Cachetypen einfärben die man dann über der Matrix aus einer Liste 8Alle, Tradi, Multi...) auswählen kann. Müsste mit etwas CSS/Javascript etc. ja machbar sein. Dann könnte man auch gucken ob man bei bestimmten Cachearten vorlieben fürs Terrain oder Difficulty hat.
Danke für das Lob! Du kannst die Idee natürlich gerne in GCStatistic übernehmen. Ich bin vor allem gespannt, wie Du die Typauswahl realisierst (bei der Statistik-Version, die ins GC-Profil geladen wird, ist es wahrscheinlich fast unmöglich, da GC AFAIK kein Javascript im Profil erlaubt).

Grüße
Flopp
 

moenk

Administrator
Teammitglied
Wäre noch schick wenn die Einzug in die Distro findet - ich wollt die da nicht nach jedem Update wieder reinpatchen.
 

TobiBook

Geonewbie
Ich hab den Code erweitert/neu geschrieben, damit auch die Summen am unteren und rechten Rand farbig erscheinen.
Demo: (jaja, bin noch nicht so aktiv ;-))

Bild8.png


Code:
##eval(

sub dtmat {
  my(%dvals,%tvals,%dtvals);
  my($text,$d,$t,$c,$dtmax,$dmax,$tmax,$dsum,$tsum);
  $dsum = 0;
  $tsum = 0;

  sub statcolor 
    {
      my $value = shift; die unless (defined $value);
      my $min = shift; die unless (defined $min);
      my $max = shift; die unless (defined $max);
      my $from = shift || "ffff00";
      my $to = shift || "ff0000";
      ($max,$min) = ($min,$max) if ($max < $min);
      $min+=0.01 if ($min == $max);
      $value = ($value>$max?$max:($value<$min?$min:$value));
      my @from = ($from =~ /^(..)(..)(..)$/);
      my @to = ($to =~ /^(..)(..)(..)$/);
      @from = map{hex($_)}(@from);
      @to = map{hex($_)}(@to);
      return sprintf("#%02x%02x%02x",
		     $from[0]+($to[0]-$from[0])*($value-$min)/($max-$min+.0),
		     $from[1]+($to[1]-$from[1])*($value-$min)/($max-$min+.0),
		     $from[2]+($to[2]-$from[2])*($value-$min)/($max-$min+.0));
    }

  foreach (keys(%found)) {
    $dvals{$found{$_}->{'Difficulty'}}++;
    $dsum += $found{$_}->{'Difficulty'};
    $tvals{$found{$_}->{'Terrain'}}++;
    $tsum += $found{$_}->{'Terrain'};
    $dtvals{$found{$_}->{'Difficulty'} . "|" . $found{$_}->{'Terrain'}}++;
  }
  foreach (keys(%dvals)) {
    $dmax = $_ if ($dvals{$dmax} < $dvals{$_});
  }
  foreach (keys(%tvals)) {
    $tmax = $_ if ($tvals{$tmax} < $tvals{$_});
  }
  foreach (keys(%dtvals)) {
    $dtmax = $_ if ($dtvals{$dtmax} < $dtvals{$_});
  }
  $text = "";
  foreach $d ((1,1.5,2,2.5,3,3.5,4,4.5,5)) {
    $text .= "\n <tr>";
    $text .= "\n  <th class='statistics'>$d</th>";
    foreach $t ((1,1.5,2,2.5,3,3.5,4,4.5,5)) {
      if (($c = $dtvals{ $d . "|" . $t }) != 0) {
	$text .= "\n  <td class='statistics' style='text-align:right;background:".(&statcolor($c,0,$dtvals{$dtmax}))."'>";
        $text .= "$c";
	$text .= "</td>";
      } else {
	$text .= "\n  <td class='statistics' style='text-align:right'> </td>";
      }
    }
    $c = $dvals{$d};
    if ($c)
      {
	$text .= "\n  <td class='statistics' style='text-align:right;background:".(&statcolor($c,0,$dvals{$dmax},"cccc00","cc0000"))."'>";
	$text .= "$c";
	$text .= "</td>";
	$text .= "\n </tr>";
      }
    else 
      {
	$text .= "\n  <td class='statistics' style='text-align:right'>0</td>";
      }
  }
  $text .= "\n <tr>";
  $text .= "\n  <td class='statistics'  style='text-align:right'> </td>";

  foreach $t ((1,1.5,2,2.5,3,3.5,4,4.5,5)) {
    $c = $tvals{$t};
    if ($c)
      {
	$text .= "\n  <td class='statistics' style='text-align:right;background:".(&statcolor($c,0,$tvals{$tmax},"cccc00","cc0000"))."'>";
	$text .= "$c";
	$text .= "</td>";
      }
    else
      {
	$text .= "\n  <td class='statistics' style='text-align:right'>0</td>";
      }
  }
  $text .= "\n  <td class='statistics'  style='text-align:right'> </td>";
  $text .= "\n </tr>";
  $text .= "\n <tr>\n  <td class='statistics'  style='text-align:center' colspan='12'>";
  $text .= scalar(keys(%dtvals)) . " von 81 möglichen D/T-Kombinationen gefunden, ";
  $text .= "arithmetisches Mittel der D/T-Werte: " . 
    sprintf("%1.2f",$dsum/scalar(keys(%found))) . 
      "/" .  sprintf("%1.2f",$tsum/scalar(keys(%found)));
  $text .= "\n  </td>\n </tr>\n";
      
  return($text);
})##
<table class="statistics">
  <caption class="statistics">Schwierigkeits/Gelände-Matrix</caption>
  <tr>
    <th class="statistics"> </th>
    <th colspan="10"  class="statistics">Gelände</td>
    <th  class="statistics"> </th>
   </tr>
   <tr>
     <th rowspan="11" class="statistics" width="12%">Schwierigkeit</td>
     <th  class="statistics" width="8%"> </th>
     <th  class="statistics" width="8%">1</th>
     <th  class="statistics" width="8%">1.5</th>
     <th  class="statistics" width="8%">2</th>
     <th  class="statistics" width="8%">2.5</th>
     <th  class="statistics" width="8%">3</th>
     <th  class="statistics" width="8%">3.5</th>
     <th  class="statistics" width="8%">4</th>
     <th  class="statistics" width="8%">4.5</th>
     <th  class="statistics" width="8%">5</th>
     <th  class="statistics" width="8%">  </th>
   </tr>
##eval(dtmat())##
</table>
 

Anhänge

  • dtmat.incl.zip
    1,2 KB · Aufrufe: 19
OP
F

flopp

Geomaster
TobiBook schrieb:
Ich hab den Code erweitert/neu geschrieben, damit auch die Summen am unteren und rechten Rand farbig erscheinen.
Demo: (jaja, bin noch nicht so aktiv ;-))
Code:
...ganz viel toller  Perl Code...
Danke für die professionelle Überarbeitung. Da sieht man, das Du Dich mit Perl auskennst ( :sign2_P: :sign2_E: :sign2_R: :sign2_L: :sign2_G: :sign2_O: :sign2_T: :sign2_T: :gott: )!
 

AndiOlli

Geocacher
TobiBook schrieb:
Ich hab den Code erweitert/neu geschrieben, damit auch die Summen am unteren und rechten Rand farbig erscheinen.
Demo: (jaja, bin noch nicht so aktiv ;-))

Das sieht auch super aus, nur wie bekomme ich es hin, das die Zahlen innerhalb der Matrix wieder zentriert stehen, das, so finde ich, sieht schöner aus.

LG Andi
 

AndiOlli

Geocacher
Danke, einen Vorschlag hätte ich noch. Kann man den jeweils höchsten Wert der Schwierigkeit und Gelände noch fett schreiben. Ich hab die Werte, die ich meine, mal markiert.

Matrix.jpg
 

AndiOlli

Geocacher
Ui, das finde ich ein bißchen zu extrem. Da wird man ja ganz konfus :irre: , aber trotzdem ein dickes Lob für die tolle Arbeit. Aber ich finde es würde reichen wenn die18 und die 16 nur fett geschrieben würden und nicht die Schriftgöße immer größer wird, umso höher die Zahl ist.
 

TobiBook

Geonewbie
Na dann halt wieder harmlos. ;)
Bild10.png


(ich hab mich übrigens für einen Zwischenlösung entschieden: Link)
 

Anhänge

  • dtmat.incl.zip
    1,3 KB · Aufrufe: 19
Oben