24
2013
PHPlot – Wyrównanie odległości pomiędzy słupkami (Bar Chart)
Używając klasy PHPlot Przy rysowaniu horyzontalnych wykresów typu Bar Chart (słupki), można zauważyć, że nie są one rysowane w równych odstępach pomiędzy sobą. Różnica jest jednego piksela. Niby nic, ale jest to problemem w przypadku łączenia dwóch rysunków ze sobą, np. oznaczenia słupków spoza phplot, sklejenie dwóch wykresów. Wówczas wysokości się desynchronizują, wykresy rozjeżdżają się góra/dół.
Przykład
Tutaj specjalnie powiększyłem grubość słupków, aby uwidocznić efekt


Rozwiązanie
Przyczyną tego błędu są zaokrąglenia przy wyznaczaniu kolejnego punktu rysowania na osi Y.
Należy wprowadzić prostą modyfikację w dwóch funkcjach ytr
(rysowanie oznaczeń przy słupkach) oraz ytrBarCharts
(rysowanie słupków) w głównym pliku klasy phplot.php
Odnajdujecie deklarację funkcji ytrBarCharts
i zamieniacie ją na niżej podany fragment kodu. Dzięki tej zmianie otrzymujemy wyrównanie wartości (data lables) do słupków (horizontal bars).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
function ytrBarCharts($y_world) { if ($this->yscale_type == 'log') { //minus because GD defines y = 0 at top. doh! $y_pixels = $this->plot_origin_y - log10($y_world) * $this->yscale ; } else { if ( $this->plot_type == 'bars' ) { // rozpoznanie czy jest to wykres typu Bar Chart $y_pixels = $this->plot_origin_y - $y_world * (int)$this->yscale; // zostawiamy tylko liczbę całkowitą, dzięki temu unikniemy potrzeby zaokrąglania } else { $y_pixels = round( $this->plot_origin_y - $y_world * $this->yscale ); } } return $y_pixels; } |
Zmieniacie funkcję ytr
, dzięki temu horyzontalne słupki są rysowane w równych odstępach pomiędzy sobą.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
function ytr($y_world) { if ($this->yscale_type == 'log') { //minus because GD defines y = 0 at top. doh! $y_pixels = $this->plot_origin_y - log10($y_world) * $this->yscale ; } else { if ( $this->plot_type == 'bars' ) { // rozpoznanie czy jest to wykres typu Bar Chart $y_pixels = $this->plot_origin_y - $y_world * (int)$this->yscale; // zostawiamy tylko liczbę całkowitą, dzięki temu unikniemy potrzeby zaokrąglania } else { $y_pixels = round( $this->plot_origin_y - $y_world * $this->yscale ); } } return $y_pixels; } |
S’il vous plaît!
Podobne tematy
Dodaj komentarz
O mnie
Najnowsze wpisy
- Drzewo kategorii – budowa struktury od dołu do góry
- PHPExcel – export + import pliku XLS
- WordPress + Polylang – Tworzenie klasy CSS z ID strony/wpisu w wybranym języku
- Mailing – Poprawna konstrukcja szablonu maila HTML/CSS i prawidłowy wygląd w programie pocztowym
- Szukasz programisty PHP dla e-commerce?