2015-04-15 2 views
7

Newb qui. Ho un csv con questi dati:istogramma D3, numero di occorrenze di data da data e ora

date, lat, lon 
01/01/2015 09:38:14 AM,37.973424,-87.575423 
01/01/2015 09:48:27 PM,37.385218,-122.11413 
01/01/2015 10:17:34 AM,39.081712,-76.554603 
01/02/2015 01:27:17 PM,40.216204,-74.619533 

voglio avere un istogramma in cui l'asse x è per data e l'asse y è il numero delle occorrenze.

Quindi Jan 1 avrebbe un'altezza di colonna di 3 e Jan 2 avrebbe un'altezza di colonna di 1. L'ora del giorno è irrilevante.

Devo analizzare le date o impostare un time interval di "giorno" in qualche modo o creare un array? Sembra che ci siano due passaggi: "filtrare" i dati in blocchi e contare i blocchi, ma non sono sicuro di come farlo.

Ho trovato this example, ma le date sono già "arrotondate" correttamente alle date e i dati sono nel file, non esterni.

Grazie per qualsiasi aiuto!

risposta

4

Tutto ciò che devi fare è scorrere i tuoi dati e mantenere un conteggio delle frequenze. Ho modificato questo bar chart example per utilizzare i tuoi dati. È necessario utilizzare i metodi Time Formatting forniti da D3.

var formatDate = d3.time.format("%m/%d/%Y %I:%M:%S %p"); 

// line = "01/01/2015 09:38:14 AM,37.973424,-87.575423" 

var parts = line.split(','); 
var datetime = formatDate.parse(parts[0]); 
var date = formatDate(datetime).split(' ')[0]; // "01/01/2015" 

esempio completa:

var margin = { 
 
    top: 20, 
 
    right: 20, 
 
    bottom: 30, 
 
    left: 40 
 
}, 
 
width = 250 - margin.left - margin.right, 
 
    height = 200 - margin.top - margin.bottom; 
 

 
var x = d3.scale.ordinal() 
 
    .rangeRoundBands([0, width], .1); 
 

 
var y = d3.scale.linear() 
 
    .range([height, 0]); 
 

 
var xAxis = d3.svg.axis() 
 
    .scale(x) 
 
    .orient("bottom"); 
 

 
var yAxis = d3.svg.axis() 
 
    .scale(y) 
 
    .orient("left") 
 
    .ticks(10); 
 

 
var svg = d3.select("body").append("svg") 
 
    .attr("width", width + margin.left + margin.right) 
 
    .attr("height", height + margin.top + margin.bottom) 
 
    .append("g") 
 
    .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); 
 

 
var csv = [ 
 
'01/01/2015 09:38:14 AM,37.973424,-87.575423', 
 
'01/01/2015 09:48:27 PM,37.385218,-122.11413', 
 
'01/01/2015 10:17:34 AM,39.081712,-76.554603', 
 
'01/02/2015 01:27:17 PM,40.216204,-74.619533' 
 
]; 
 

 
var formatDate = d3.time.format("%m/%d/%Y %I:%M:%S %p"); 
 

 
var tally = {}; 
 

 
csv.forEach(function(line) { 
 
    var parts = line.split(','); 
 
    var datetime = formatDate.parse(parts[0]); 
 
    var date = formatDate(datetime).split(' ')[0]; 
 
    
 
    tally[date] = (tally[date]||0) + 1; 
 
}); 
 

 
var data = []; 
 

 
for (var date in tally) { 
 
    if (tally.hasOwnProperty(date)) { 
 
     data.push({ 
 
      date: date, 
 
      frequency: tally[date] 
 
     }); 
 
    } 
 
} 
 

 
x.domain(data.map(function (d) { 
 
    return d.date; 
 
})); 
 
y.domain([0, d3.max(data, function (d) { 
 
    return d.frequency; 
 
})]); 
 

 
svg.append("g") 
 
    .attr("class", "x axis") 
 
    .attr("transform", "translate(0," + height + ")") 
 
    .call(xAxis); 
 

 
svg.append("g") 
 
    .attr("class", "y axis") 
 
    .call(yAxis) 
 
    .append("text") 
 
    .attr("transform", "rotate(-90)") 
 
    .attr("y", 6) 
 
    .attr("dy", ".71em") 
 
    .style("text-anchor", "end") 
 
    .text("Frequency"); 
 

 
svg.selectAll(".bar") 
 
    .data(data) 
 
    .enter().append("rect") 
 
    .attr("class", "bar") 
 
    .attr("x", function (d) { 
 
    return x(d.date); 
 
}) 
 
    .attr("width", x.rangeBand()) 
 
    .attr("y", function (d) { 
 
    return y(d.frequency); 
 
}) 
 
    .attr("height", function (d) { 
 
    return height - y(d.frequency); 
 
}); 
 

 

 
function type(d) { 
 
    d.frequency = +d.frequency; 
 
    return d; 
 
}
.bar { 
 
    fill: steelblue; 
 
} 
 
.bar:hover { 
 
    fill: brown; 
 
} 
 
.axis { 
 
    font: 10px sans-serif; 
 
} 
 
.axis path, .axis line { 
 
    fill: none; 
 
    stroke: #000; 
 
    shape-rendering: crispEdges; 
 
} 
 
.x.axis path { 
 
    display: none; 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>

JSFiddle Demo

Caricamento da file CSV:

012.351.641,061 mila
var formatDate = d3.time.format("%m/%d/%Y %I:%M:%S %p"); 

var tally = {}; 
var data = []; 

d3.csv('./data.csv') 
.get(function(error, rows) { 

    rows.forEach(function(obj, i) { 
    var datetime = formatDate.parse(obj.date); 
    var date = formatDate(datetime).split(' ')[0]; 
    tally[date] = (tally[date]||0) + 1; 
    }); 

    for (var date in tally) { 
    if (tally.hasOwnProperty(date)) { 
     data.push({ 
      date: date, 
      frequency: tally[date] 
     }); 
    } 
    } 

    console.log(data); 
}); 
+0

Oh grazie! Molto apprezzato! Una rapida domanda di follow-up. Hai i dati in "var = csv". I miei dati sono in un file csv esterno di 20.000 righe. Come collego i due? Ho provato a racchiudere la funzione forEach in d3.csv, ma qualcosa non funziona. (scusate, non riesco nemmeno a visualizzare questo codice in un blocco): 'd3.csv (" data/test.csv ", function (error, line) { forEach (function (line) { var parts = line.split (','); var datetime = formatDate.parse (parts [0]); var date = formatDate (datetime) .split ('') [0]; tally [data] = (tally [data] || 0) + 1; }); }); ' – airwwwave

+0

@airwwwave vedere la risposta aggiornata –

+0

Grazie mille. Lo proverò e riferirò! – airwwwave