Как выбрать только x строк из csv-файла для круговой диаграммы

#d3.js #data-visualization #pie-chart

#d3.js #визуализация данных #круговая диаграмма

Вопрос:

У меня есть CSV-файл, содержащий сотни строк, вот пример :

city.csv:

 City,JanTemp,Lat,Long
Indianapolis  IN,21,39.8,86.9
Des_Moines  IA,11,41.8,93.6
Wichita  KS,22,38.1,97.6
Louisville  KY,27,39,86.5
New_Orleans LA,45,30.8,90.2
Portland  ME,12,44.2,70.5
Baltimore  MD,25,39.7,77.3
Boston  MA,23,42.7,71.4
Detroit  MI,21,43.1,83.9
Minneapolis  MN,2,45.9,93.9
St_Louis  MO,24,39.3,90.5
Helena  MT,8,47.1,112.4
Omaha  NE,13,41.9,96.1
Concord  NH,11,43.5,71.9
Atlantic_City  NJ,27,39.8,75.3
Albuquerque  NM,24,35.1,106.7
Albany  NY,14,42.6,73.7
New_York  NY,27,40.8,74.6
  

Что я хочу сделать, так это создать круговую диаграмму, представляющую JanTemp для каждых 10 строк.

Вот мой исходный код для создания круговой диаграммы для всех строк :

скрипт:

 <script>



        var width = 500;
        var height = 500;
        var radius = Math.min(width, height) / 2;
        var donutWidth = 120;
        var legendRectSize = 18;
        var legendSpacing = 4;

        var color = d3.scale.category20();

        var svg = d3.select('#chart')
          .append('svg')
          .attr('width', width)
          .attr('height', height)
          .append('g')
          .attr('transform', 'translate('   (width / 2)   
            ','   (height / 2)   ')');

        var arc = d3.svg.arc()
          .innerRadius(radius - donutWidth)
          .outerRadius(radius);

        var pie = d3.layout.pie()
          .value(function(d) { return d.JanTemp; })
          .sort(null);

        d3.csv('city.csv', function(error, dataset) {           
          dataset.forEach(function(d) {                             
            d.JanTemp =  d.JanTemp;                                     
          });                                                       

          var path = svg.selectAll('path')
            .data(pie(dataset))
            .enter()
            .append('path')
            .attr('d', arc)
            .attr('fill', function(d, i) { 
              return color(d.data.City);
            });

          var legend = svg.selectAll('.legend')
            .data(color.domain())
            .enter()
            .append('g')
            .attr('class', 'legend')
            .attr('transform', function(d, i) {
              var height = legendRectSize   legendSpacing;
              var offset =  height * color.domain().length / 2;
              var horz = -2 * legendRectSize;
              var vert = i * height - offset;
              return 'translate('   horz   ','   vert   ')';
            });

          legend.append('rect')
            .attr('width', legendRectSize)
            .attr('height', legendRectSize)
            .style('fill', color)
            .style('stroke', color);

          legend.append('text')
            .attr('x', legendRectSize   legendSpacing)
            .attr('y', legendRectSize - legendSpacing)
            .text(function(d) { return d; });                       

        });                                                         


    </script>
  

Код работает, но визуализация плохая.


Вопрос в следующем : Как я могу создать круговую диаграмму для каждых 10 строк в CSV — файле ? (Где также я могу добавить свойство, чтобы получать строки только по 10 ?) Возможно ли это вообще?

Комментарии:

1. Примечание: ваш CSV-файл имеет неправильную форму. Значения широты / lon обозначаются с помощью десятичной запятой, тогда как это должна быть десятичная точка. Таким образом, количество столбцов данных, разделенных запятыми , не соответствует количеству столбцов, определяемому заголовком. Согласно RFC 4180 , «заголовок будет содержать имена, соответствующие полям в файле, и должен содержать такое же количество полей, что и записи в остальной части файла» (подчеркнуть мое). Так и должно быть Indianapolis IN,21,39.8,86.9 .

2. ops! я этого не заметил, я обновлю это! спасибо за примечание!

Ответ №1:

У вас есть два способа сделать это, первый — просто повторить то, что у вас уже есть, и создать несколько SVG-файлов, по одному для каждой точечной диаграммы.

Второй вариант немного более элегантный и включает в себя один SVG, управляемый D3. Сначала вам нужно изменить порядок данных, разделив их на блоки по 10:

 function( alldata ) {
    var dataDivide = [], i, chunk = 10; 
    for (i=0; i<alldata.length; i =chunk)          
    {
         dataDivide.push(alldata.slice(i, i chunk));
    }
}
  

Теперь вы можете использовать D3 для разделения вашего SVG, а затем задать фрагменты, которые будут вашими данными для каждой точечной диаграммы:

     var svg.selectAll("g")
        .data( dataDivide )
        .enter()
        .append("g")
            // position the g, etc.
        .selectAll('path') 
        .data( function(d) {
            return pie(d); // d is a chunk
        }) 
        .enter() 
        .append('path')
            // etc.
  

Комментарии:

1. Я что-то не понял?

2. Чего я хотел, так это: каждые 10 элементов -> в 1 круговом чате.

3. Спасибо за вашу помощь! это было здорово! В вашем коде отсутствовало «return», я добавил его.