2012-07-18 11 views
15

Mam wykres słupkowy zbudowany z Highcharts, który wykorzystuje kategorie dla osi X - naprawdę długie kategorie uciążliwe. Nie mogę wymyślić dobry sposób, aby upewnić się, że kategorie zawsze pozostają na jednej linii. Nie mogę skracać ich pod warunkiem, że nie mogę użyć etykiety narzędziowej lub czegoś, aby pokazać długą wersję po najechaniu myszą lub innej intuicyjnej interakcji użytkownika. Po zawinięciu linii kategorii zaczyna wyglądać jak ściana tekstu.do czynienia z wykresu słupkowego w zestawie high chart z naprawdę długimi nazwami kategorii

Wszelkie pomysły na wyświetlanie długich kategorii i danych w czysty sposób? Jestem gotów rozważyć inny rodzaj wykresu, o ile wyświetla dane w jasny i ładny sposób. Chciałbym trzymać się Highcharts, ale tylko jeśli to możliwe.

EDIT: Po wielu staraniach, dałem się na idei dodanie podpowiedzi do kategorii etykiety osi x w przekroju przeglądarki (IE6 +) sposób. Nawet w przypadku JQuery nie wydaje się to możliwe ani praktyczne. Nadal szukam jakiegoś rozwiązania, które pozwala mi ładnie wyświetlać te długie kategorie (nie jestem zadowolony z wcześniej utworzonego, ponieważ unoszące się nad paskiem danych nie jest wystarczająco oczywiste dla użytkownika).

Obraz wykresu problemów, z kategorie zaciemnione: Labels too long, going to next line

kod JSFiddle:

HTML:

<div id="container" style="min-width: 400px; height: 400px; margin: 0 auto"></div> 
<div id='mytoolTip'></div> 

Javascript:

$(function() { 
    var chart; 
    $(document).ready(function() { 
     chart = new Highcharts.Chart({ 
      chart: { 
       renderTo: 'container', 
       type: 'bar' 
      }, 
      title: { 
       text: 'Historic World Population by Region' 
      }, 
      subtitle: { 
       text: 'Source: Wikipedia.org' 
      }, 
      xAxis: { 
       categories: ['Africa blahblahblah blah blah blah ', 'America blahblahblah blah blah blah ', 'Asia blahblahblah blah blah blah', 'Europe blahblahblah blah blah blah ', 'Oceania blahblahblah blah blah blah '], 
        title: { 
         text: null 
        }, 
        labels: { 
         formatter: function() { 
          return(this.value.substring(0,10) + "..."); 
         } 
        }        
       }, 
       yAxis: { 
        min: 0, 
        title: { 
         text: 'Population (millions)', 
         align: 'high' 
        }, 
        labels: { 
         overflow: 'justify' 
        } 
       }, 
       tooltip: { 
        formatter: function() { 
         $("#mytoolTip").html(this.x + 'and the value is ' + this.y) ; 
         return false ; 
        } 
       }, 
       plotOptions: { 
        bar: { 
         dataLabels: { 
          enabled: true 
         } 
        } 
       }, 
       legend: { 
        layout: 'vertical', 
        align: 'right', 
        verticalAlign: 'top', 
        x: -100, 
        y: 100, 
        floating: true, 
        borderWidth: 1, 
        backgroundColor: '#FFFFFF', 
        shadow: true 
       }, 
       credits: { 
        enabled: false 
       }, 
       series: [{ 
        name: 'Year 1800', 
        data: [107, 31, 635, 203, 2] 
       }, { 
        name: 'Year 1900', 
        data: [133, 156, 947, 408, 6] 
       }, { 
        name: 'Year 2008', 
        data: [973, 914, 4054, 732, 34] 
       }] 
      }); 
     }); 
    }); 
+0

jeśli przesunąć -tip narzędzie do zewnętrznego 'div' mieć lepsze formatu jest to, że odbiera zapytanie –

+0

Tak, chociaż ja już uznać tę opcję. Masz pomysł, jak uzyskać współrzędne etykiet kategorii? – AlexMA

+0

co masz na myśli zrobić z kategorią? –

Odpowiedz

19

Spróbuj skrzypce:http://jsfiddle.net/a6zsn/70/

Mieliśmy podobny problem, który w końcu rozwiązany poprzez umożliwienie etykiety używać HTML. Chociaż nie podaliśmy dokładnego rozwiązania zamieszczonego poniżej, powinno to zadziałać, ponieważ używa widgetu podpowiedzi narzędzia jQueryUI, aby wyświetlić pełny tekst po najechaniu myszą.

Zobacz, jak definiuję obiekt xAxis.labels.

$(function() { 
    var chart; 
    $(document).ready(function() { 
     chart = new Highcharts.Chart({ 
      chart: { 
       renderTo: 'container', 
       type: 'bar', 
       events: { 
        load: function (event) { 
         $('.js-ellipse').tooltip(); 
        } 
       } 
      }, 
      title: { 
       text: 'Historic World Population by Region' 
      }, 
      subtitle: { 
       text: 'Source: Wikipedia.org' 
      }, 
      xAxis: { 
       categories: ['Africa is the best place to do safari. Label is soooo big that it iss ugly now. =(. -38023-8412-4812-4812-403-8523-52309583409853409530495340985 ', 'America is the best place you can ever live in ', 'Asia is the best food ever ', 'Europe best chicks ever on earth ', 'Oceania i dont know any thing about this place '], 
       title: { 
        text: null 
       }, 
       labels: { 
        formatter: function() { 
         var text = this.value, 
          formatted = text.length > 25 ? text.substring(0, 25) + '...' : text; 

         return '<div class="js-ellipse" style="width:150px; overflow:hidden" title="' + text + '">' + formatted + '</div>'; 
        }, 
        style: { 
         width: '150px' 
        }, 
        useHTML: true 
      } 
      }, 
      yAxis: { 
       min: 0, 
       title: { 
        text: 'Population (millions)', 
        align: 'high' 
       }, 
       labels: { 
        overflow: 'justify' 
       } 
      }, 
      tooltip: { 
       formatter: function() { 
        $("#mytoolTip").html(this.x + 'and the value is ' + this.y) ; 
        return false ; 
       } 
      }, 
      plotOptions: { 
       bar: { 
        dataLabels: { 
         enabled: true 
        } 
       } 
      }, 
      legend: { 
       layout: 'vertical', 
       align: 'right', 
       verticalAlign: 'top', 
       x: -100, 
       y: 100, 
       floating: true, 
       borderWidth: 1, 
       backgroundColor: '#FFFFFF', 
       shadow: true 
      }, 
      credits: { 
       enabled: false 
      }, 
      series: [{ 
       name: 'Year 1800', 
       data: [107, 31, 635, 203, 2] 
      }, { 
       name: 'Year 1900', 
       data: [133, 156, 947, 408, 6] 
      }, { 
       name: 'Year 2008', 
       data: [973, 914, 4054, 732, 34] 
      }] 
     }); 
    }); 

}); 
+1

Gdzie możemy znaleźć definicję stylu .js-ellipse? Dziękuję za udostępnienie tego rozwiązania. –

+0

efektywnym sposobem byłoby użycie: var labelTooltip = ''; $ ("głowa") .endend (labelTooltip); return "

' + formatted + '
"; – wolfsbane

+0

Wymyśliłem to samo rozwiązanie. Ale to też nie jest atrakcyjne. Zastanawiasz się, czy ktokolwiek lub Highcharts wymyślił sposób, w którym istnieje możliwość zawarcia długich etykiet na liczby linii, które można określić, i skrócić resztę za pomocą elipsy. – tnkh

6

pracyjsFiddle

przesuwając podpowiedź:

HTML

<div id='mytoolTip'></div>​ 

JavaScript

tooltip: { 
      formatter: function() { 

       $("#mytoolTip").html(this.x + 'and the value is ' + this.y) ; 
       return false ; 
      } 
     }, 

to w jaki sposób można uzyskać nazwę kategorii z narzędzia końcówką unoszącego

 this.key 

jsFiddle

+0

Dobra odpowiedź - to może pomóc. Dam ci kredyt, jeśli lepsza odpowiedź nie nadejdzie. Jedynym problemem z tą odpowiedzią jest to, że nie rozwiązuje problemu etykiet kategorii wzdłuż zawijania linii osi X, gdy rozmiar ekranu jest mały lub etykiety naprawdę duże: zobacz http://jsfiddle.net/a6zsn/1/ – AlexMA

+0

Nie powiedziałeś mi, jaki dokładnie jest twój plan z ciągiem kategorii –

+0

Potrzebuję być w stanie zobaczyć pełną, długą wersję gdzieś, ale nie można zawijać linii, gdy jest to etykieta osi x. Skrót jest w porządku, o ile etykieta pełnej kategorii jest widoczna (gdzieś). Mogę utworzyć tablicę krótkich etykiet odwzorowanych na tablicę długich etykiet, a następnie użyć techniki podpowiedzi jquery do utworzenia niestandardowej podpowiedzi. Jeśli istnieje łatwiejsze rozwiązanie, choć chciałbym to zobaczyć. – AlexMA

4

Przycinanie etykiety

xAxis: { 
      categories: ['Foo afkhbakfbakjfbakfbnbafnbaf', 'Bar', 'Foobar'], 
      labels: { 
       formatter: function() { 
        return this.value.substring(0, 8); 
       } 
      } 
     }, 
Powiązane problemy