A snippet from ta.virot.me/tweettimeline
Built with blockbuilder.org
forked from tvirot's block: TweetTimeline
| license: mit |
| {"tweet": {"num_photos": 0, "num_user_mentions": 0, "text": "Stop Working All Those Hours http://t.co/R7oc0xzw", "created_at": "2012-06-15T15:35:03", "num_hashtag": 0, "num_urls": 1, "retweet_count": 155, "id": "213655868590407680"}, "arcs": [{"to": 1, "from": 0}, {"to": 2, "from": 0}, {"to": 3, "from": 0}, {"to": 4, "from": 0}, {"to": 5, "from": 0}, {"to": 6, "from": 0}, {"to": 7, "from": 0}, {"to": 8, "from": 0}, {"to": 9, "from": 0}, {"to": 10, "from": 0}, {"to": 11, "from": 0}, {"to": 12, "from": 0}, {"to": 13, "from": 0}, {"to": 14, "from": 0}, {"to": 15, "from": 0}, {"to": 16, "from": 0}, {"to": 18, "from": 0}, {"to": 19, "from": 0}, {"to": 20, "from": 0}, {"to": 21, "from": 0}, {"to": 22, "from": 0}, {"to": 23, "from": 0}, {"to": 25, "from": 0}, {"to": 26, "from": 0}, {"to": 27, "from": 0}, {"to": 29, "from": 0}, {"to": 31, "from": 0}, {"to": 33, "from": 0}, {"to": 34, "from": 0}, {"to": 35, "from": 0}, {"to": 37, "from": 0}, {"to": 39, "from": 0}, {"to": 41, "from": 0}, {"to": 42, "from": 0}, {"to": 44, "from": 0}, {"to": 45, "from": 0}, {"to": 46, "from": 0}, {"to": 47, "from": 0}, {"to": 48, "from": 0}, {"to": 51, "from": 0}, {"to": 52, "from": 0}, {"to": 53, "from": 0}, {"to": 54, "from": 0}, {"to": 55, "from": 0}, {"to": 57, "from": 0}, {"to": 58, "from": 53}, {"to": 61, "from": 0}, {"to": 62, "from": 0}, {"to": 63, "from": 0}, {"to": 64, "from": 0}, {"to": 66, "from": 0}, {"to": 67, "from": 0}, {"to": 68, "from": 0}, {"to": 70, "from": 0}, {"to": 71, "from": 62}, {"to": 71, "from": 0}, {"to": 72, "from": 0}, {"to": 74, "from": 0}, {"to": 76, "from": 61}, {"to": 76, "from": 0}, {"to": 77, "from": 0}, {"to": 78, "from": 0}, {"to": 79, "from": 76}, {"to": 80, "from": 0}, {"to": 82, "from": 0}, {"to": 83, "from": 0}, {"to": 84, "from": 0}, {"to": 85, "from": 0}, {"to": 87, "from": 0}], "nodes": [{"followers_count": 769805, "id": 14800270, "created_after": 0, "screen_name": "HarvardBiz"}, {"followers_count": 411, "id": 272583709, "created_after": 2184, "screen_name": "EnzodellaRocca"}, {"followers_count": 60, "id": 64971088, "created_after": 2194, "screen_name": "innaratieva"}, {"followers_count": 88, "id": 106523940, "created_after": 2200, "screen_name": "ChangeGijsbert"}, {"followers_count": 257, "id": 21844846, "created_after": 2364, "screen_name": "jdomingo57"}, {"followers_count": 8, "id": 276985083, "created_after": 2389, "screen_name": "mcktaryn"}, {"followers_count": 123, "id": 108849605, "created_after": 2417, "screen_name": "4waytest"}, {"followers_count": 54, "id": 251553111, "created_after": 2456, "screen_name": "Wabbiss"}, {"followers_count": 67, "id": 77160350, "created_after": 2471, "screen_name": "Cino1933"}, {"followers_count": 119, "id": 179593914, "created_after": 2520, "screen_name": "jeremybeaudry"}, {"followers_count": 111, "id": 23790487, "created_after": 3174, "screen_name": "thecarriefisher"}, {"followers_count": 40, "id": 197272778, "created_after": 3216, "screen_name": "fernitorres"}, {"followers_count": 10, "id": 31459122, "created_after": 3256, "screen_name": "Davide_Cinguino"}, {"followers_count": 184, "id": 6280722, "created_after": 3446, "screen_name": "rfinney"}, {"followers_count": 48, "id": 133186284, "created_after": 3545, "screen_name": "PShoe_turtle"}, {"followers_count": 83, "id": 17110045, "created_after": 4113, "screen_name": "taravati"}, {"followers_count": 2532, "id": 14581524, "created_after": 4205, "screen_name": "tbump"}, {"followers_count": 276, "id": 20437113, "created_after": 4303, "screen_name": "manselk"}, {"followers_count": 10, "id": 585961221, "created_after": 4507, "screen_name": "AtlasBHConsult"}, {"followers_count": 27, "id": 404077760, "created_after": 4606, "screen_name": "CGarcesA"}, {"followers_count": 85, "id": 294561070, "created_after": 4735, "screen_name": "mireychalouhi"}, {"followers_count": 33, "id": 483271276, "created_after": 4971, "screen_name": "SStothard"}, {"followers_count": 73, "id": 278005613, "created_after": 5147, "screen_name": "IstisharaSTK"}, {"followers_count": 80, "id": 36205250, "created_after": 5325, "screen_name": "emargarettaylor"}, {"followers_count": 19, "id": 125170828, "created_after": 5593, "screen_name": "MattMurph63"}, {"followers_count": 134, "id": 19600661, "created_after": 6201, "screen_name": "spooper"}, {"followers_count": 108, "id": 69250260, "created_after": 6339, "screen_name": "dorotazys"}, {"followers_count": 65, "id": 32629004, "created_after": 7475, "screen_name": "BigBZ"}, {"followers_count": 113, "id": 147317390, "created_after": 8148, "screen_name": "Jason_Southern"}, {"followers_count": 23, "id": 334199812, "created_after": 8318, "screen_name": "Hey_RJ"}, {"followers_count": 197, "id": 202171628, "created_after": 8335, "screen_name": "RedMarlinUK"}, {"followers_count": 115, "id": 22792124, "created_after": 8485, "screen_name": "elisecarbone"}, {"followers_count": 109, "id": 241850910, "created_after": 8523, "screen_name": "sarahstephens08"}, {"followers_count": 41, "id": 117355010, "created_after": 8603, "screen_name": "priyajain_15"}, {"followers_count": 33, "id": 271451747, "created_after": 8667, "screen_name": "cponce14"}, {"followers_count": 161, "id": 121579335, "created_after": 8721, "screen_name": "ImamPujaya"}, {"followers_count": 21, "id": 218063812, "created_after": 9563, "screen_name": "MHB9978"}, {"followers_count": 251, "id": 250375417, "created_after": 10887, "screen_name": "msrobbin1"}, {"followers_count": 55, "id": 16667435, "created_after": 11066, "screen_name": "zsidane"}, {"followers_count": 166, "id": 16201841, "created_after": 11317, "screen_name": "marktilbury"}, {"followers_count": 2377, "id": 11940352, "created_after": 11496, "screen_name": "duanebrown"}, {"followers_count": 54, "id": 376044422, "created_after": 11540, "screen_name": "ErikMan8"}, {"followers_count": 147, "id": 44200554, "created_after": 13109, "screen_name": "j_bonesy"}, {"followers_count": 15, "id": 423448903, "created_after": 13170, "screen_name": "waleed_mas"}, {"followers_count": 56, "id": 135910726, "created_after": 15337, "screen_name": "vrdgez"}, {"followers_count": 20, "id": 464493163, "created_after": 17140, "screen_name": "ThThemi"}, {"followers_count": 149, "id": 413491009, "created_after": 17997, "screen_name": "comichph"}, {"followers_count": 9, "id": 555250396, "created_after": 18243, "screen_name": "dtapartnership"}, {"followers_count": 7, "id": 136963260, "created_after": 19779, "screen_name": "Martinodm10"}, {"followers_count": 212, "id": 39491102, "created_after": 20224, "screen_name": "beuchelt"}, {"followers_count": 142, "id": 40975622, "created_after": 22038, "screen_name": "IvanLares"}, {"followers_count": 9, "id": 428583562, "created_after": 22125, "screen_name": "Timasovich"}, {"followers_count": 78, "id": 348662725, "created_after": 23220, "screen_name": "EricLuistro"}, {"followers_count": 698, "id": 51343383, "created_after": 26612, "screen_name": "danklynn"}, {"followers_count": 21, "id": 448284720, "created_after": 26651, "screen_name": "EHuff_Triathlon"}, {"followers_count": 64, "id": 88299296, "created_after": 27407, "screen_name": "jonbg"}, {"followers_count": 15, "id": 149572914, "created_after": 28833, "screen_name": "jackcartwright"}, {"followers_count": 626, "id": 98599779, "created_after": 31344, "screen_name": "QyunHuda"}, {"followers_count": 64, "id": 74358989, "created_after": 34065, "screen_name": "sedavison"}, {"followers_count": 22, "id": 26835421, "created_after": 34510, "screen_name": "oscar_uk"}, {"followers_count": 5, "id": 466065047, "created_after": 35884, "screen_name": "smemadi"}, {"followers_count": 605, "id": 25230340, "created_after": 36465, "screen_name": "wenhwu"}, {"followers_count": 92, "id": 17750619, "created_after": 38135, "screen_name": "subbins"}, {"followers_count": 23, "id": 159319367, "created_after": 41713, "screen_name": "GregoryArtinoff"}, {"followers_count": 15, "id": 79173847, "created_after": 42963, "screen_name": "manuelsimo"}, {"followers_count": 65, "id": 21202409, "created_after": 43380, "screen_name": "chrismarin"}, {"followers_count": 11, "id": 192930772, "created_after": 43860, "screen_name": "Jzigne"}, {"followers_count": 893, "id": 43287399, "created_after": 44108, "screen_name": "UmYazan"}, {"followers_count": 7, "id": 35846773, "created_after": 47646, "screen_name": "mmmAlinka"}, {"followers_count": 6, "id": 56656054, "created_after": 48076, "screen_name": "kaizenworld_com"}, {"followers_count": 294, "id": 41386884, "created_after": 48310, "screen_name": "ATradSquare"}, {"followers_count": 154, "id": 469158564, "created_after": 49714, "screen_name": "RahulPratti"}, {"followers_count": 20, "id": 50977034, "created_after": 49875, "screen_name": "mushma0c"}, {"followers_count": 473, "id": 11856012, "created_after": 53646, "screen_name": "jonnyashton"}, {"followers_count": 275, "id": 82065217, "created_after": 54603, "screen_name": "AndhyMu"}, {"followers_count": 2, "id": 537635860, "created_after": 59397, "screen_name": "tom_donlon"}, {"followers_count": 453, "id": 320950469, "created_after": 59835, "screen_name": "ronanlupton"}, {"followers_count": 66, "id": 376467006, "created_after": 59846, "screen_name": "ShinboneStarr"}, {"followers_count": 6, "id": 510562286, "created_after": 62760, "screen_name": "capriconwells"}, {"followers_count": 32, "id": 44468461, "created_after": 70367, "screen_name": "DeirdreArdagh"}, {"followers_count": 57, "id": 252261291, "created_after": 72612, "screen_name": "AH2C"}, {"followers_count": 9, "id": 110491822, "created_after": 73663, "screen_name": "catalinccc"}, {"followers_count": 1140, "id": 14422924, "created_after": 74145, "screen_name": "pedrowm"}, {"followers_count": 39, "id": 187513216, "created_after": 75282, "screen_name": "thewonderloft"}, {"followers_count": 48, "id": 452391901, "created_after": 77082, "screen_name": "kamilest"}, {"followers_count": 14, "id": 241786069, "created_after": 78117, "screen_name": "woodybrokenburr"}, {"followers_count": 52, "id": 33552828, "created_after": 78873, "screen_name": "juantxon"}, {"followers_count": 24, "id": 184278988, "created_after": 79099, "screen_name": "MarcRLup"}, {"followers_count": 94, "id": 106525992, "created_after": 82288, "screen_name": "DadisiSPEAKS"}], "author": {"screen_name": "HarvardBiz", "profile_image": "https://si0.twimg.com/profile_images/661586716/favicon_64_normal.png", "id": 14800270, "name": "Harvard Biz Review"}} |
A snippet from ta.virot.me/tweettimeline
Built with blockbuilder.org
forked from tvirot's block: TweetTimeline
| <!DOCTYPE html> | |
| <head> | |
| <meta charset="utf-8"> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js"></script> | |
| <style> | |
| body { | |
| font-family: 'HelveticaNeue-Light', Arial, Helvetica, sans-serif; | |
| font-size: 14px; | |
| } | |
| .container#tweet { | |
| padding-top: 30px; | |
| } | |
| div.tooltip { | |
| background: rgba(0, 0, 0, 0.6); | |
| color: #FFFFFF; | |
| font-size: 12px; | |
| font-family: 'HelveticaNeue-Light', Arial, Helvetica, sans-serif; | |
| padding: 4px 6px; | |
| pointer-events: none; | |
| position: absolute; | |
| text-align: center; | |
| } | |
| </style> | |
| </head> | |
| <body> | |
| <div class="container" id="tweet"></div> | |
| <div class="container" id="plot"></div> | |
| <script> | |
| function addCommas(nStr){ | |
| nStr += ''; | |
| x = nStr.split('.'); | |
| x1 = x[0]; | |
| x2 = x.length > 1 ? '.' + x[1] : ''; | |
| var rgx = /(\d+)(\d{3})/; | |
| while (rgx.test(x1)) { | |
| x1 = x1.replace(rgx, '$1' + ',' + '$2'); | |
| } | |
| return x1 + x2; | |
| } | |
| var tooltip = d3.select("div#plot").append("div") | |
| .attr("class", "tooltip") | |
| .style("opacity", 0); | |
| function showtt(text){ | |
| tooltip.text(text).style("opacity", 1); | |
| } | |
| function movett(){ | |
| tooltip.style("left", d3.event.pageX + 12 + "px") | |
| .style("top", d3.event.pageY + 5 + "px"); | |
| } | |
| function hidett(){ | |
| tooltip.style("opacity", 0); | |
| } | |
| var data; | |
| var isEvenSpaced = false; | |
| var isInit = false; | |
| d3.json("213655868590407680.json", function(json){ | |
| data = json; | |
| plot(data, isEvenSpaced); | |
| }); | |
| function plot(data, isEvenSpaced){ | |
| var width = 1000; | |
| var height = 200; | |
| var profile = d3.select("div#tweet") | |
| .append("svg") | |
| .attr("class", "profile") | |
| .attr("width", width) | |
| .attr("height", 120); | |
| profile.append("image") | |
| .attr("xlink:href", "https://pbs.twimg.com/profile_images/600303920125214721/uy-506Vm_400x400.jpg") | |
| .attr("x", 50) | |
| .attr("y", "0") | |
| .attr("width", "48px") | |
| .attr("height", "48px") | |
| .style("cursor", "hand") | |
| .on("click", function(){ | |
| window.open("http://www.twitter.com/" + data.author.screen_name, "_blank"); | |
| }); | |
| profile.append("text") | |
| .text(data.author.name) | |
| .attr("x", 105) | |
| .attr("y", 2) | |
| .attr("dy", "1em") | |
| .style("fill", "#000000") | |
| .style("font-weight", "bold") | |
| .style("font-size", "24px") | |
| .style("cursor", "hand") | |
| .on("click", function(d,i){ | |
| window.open("http://www.twitter.com/" + data.author.screen_name, "_blank"); | |
| }); | |
| profile.append("text") | |
| .text("@" + data.author.screen_name) | |
| .attr("x", 105) | |
| .attr("y", 48 - 2) | |
| .attr("dy", "-0.1em") | |
| .style("fill", "#999999") | |
| .style("font-size", "14px") | |
| .style("cursor", "hand") | |
| .on("click", function(d,i){ | |
| window.open("http://www.twitter.com/" + data.author.screen_name, "_blank"); | |
| }); | |
| profile.append("text") | |
| .text(data.tweet.text) | |
| .attr("x", 50) | |
| .attr("y", 48 + 10) | |
| .attr("dy", "1em") | |
| .style("fill", "#000000") | |
| .style("font-size", "14px") | |
| .style("cursor", "hand") | |
| .on("mouseover", function(d,i){ | |
| d3.select(this).style("fill", "#F1B054"); | |
| }) | |
| .on("mouseout", function(d,i){ | |
| d3.select(this).style("fill", "#000000"); | |
| }) | |
| .on("click", function(d,i){ | |
| window.open("http://www.twitter.com/" + data.author.screen_name + "/status/" + data.tweet.id, "_blank"); | |
| }); | |
| profile.append("text") | |
| .text("Retweeted " + (data.nodes.length - 1) + | |
| " times. Displayed to " + addCommas(d3.sum(data.nodes, function(d) { return d.followers_count; })) + " users.") | |
| .attr("x", 50) | |
| .attr("y", 48 + 45) | |
| .attr("dy", "1em") | |
| .style("fill", "#993333") | |
| .style("font-size", "14px"); | |
| var timeline = d3.select("div#plot").append("svg") | |
| .attr("class", "timeline") | |
| .attr("width", width) | |
| .attr("height", height); | |
| var created_after_list = data.nodes.map(function(n) { return n.created_after; }); | |
| var max_followers_count = d3.max(data.nodes.map(function(n) { return n.followers_count; } )); | |
| var max_created_after = d3.max(created_after_list); | |
| var x; | |
| if(isEvenSpaced) { | |
| x = d3.scale.ordinal() | |
| .domain(created_after_list) | |
| .rangeBands([100, width - 100]); | |
| } else { | |
| x = d3.scale.linear() | |
| .domain([0, max_created_after]) | |
| .range([100, width - 100]); | |
| } | |
| var y = d3.scale.linear() | |
| .domain([0, width - 2 * 100]) | |
| .range([0, height / 2 - 20]); | |
| var r = d3.scale.log() | |
| .domain([1, max_followers_count]) | |
| .range([0, height / 2 - 20]); | |
| var curve_gen = d3.svg.line() | |
| .interpolate("cardinal") | |
| .x(function(d) { return d.x; }) | |
| .y(function(d) { return d.y; }); | |
| var arcs = timeline.selectAll("arc") | |
| .data(data.arcs).enter(); | |
| function generateControlPoints(x1, x2){ | |
| return [ {x: x1, y: 100}, | |
| {x: (x1+x2)/2.0, y: 100 - y(Math.abs(x1-x2))}, | |
| {x: x2, y: 100} ]; | |
| } | |
| var curves = arcs.append("path") | |
| .style("stroke", "#444444") | |
| .style("stroke-opacity", "0.2") | |
| .style("stroke-width", "1.5px") | |
| .style("fill", "none") | |
| .attr("d", function(d) { | |
| x1 = x(created_after_list[d.from]); | |
| x2 = x(created_after_list[d.to]); | |
| return curve_gen.tension(0)(generateControlPoints(x1, x2)); | |
| }); | |
| timeline.append("rect") | |
| .attr("x", x(0)) | |
| .attr("y", 0) | |
| .attr("width", width) | |
| .attr("height", 100) | |
| .style("fill", "#FFFFFF") | |
| .transition() | |
| .duration(function() { return (isInit) ? 0 : 1100; }) | |
| .ease("cubic-in-out") | |
| .attr("x", width) | |
| .remove(); | |
| var nodes = timeline.selectAll("node") | |
| .data(data.nodes).enter(); | |
| nodes.append("circle") | |
| .attr("class", "outer") | |
| .attr("id", function(d,i) { return "outer-" + i; }) | |
| .attr("cx", function(d) { return x(d.created_after); } ) | |
| .attr("cy", 100) | |
| .style("fill", "#993333") | |
| .style("fill-opacity", 0.1) | |
| .style("stroke", "none") | |
| .style("stroke-width", "3px") | |
| .transition() | |
| .delay(function(d,i) { return (isInit) ? 0 : d.created_after * 500 / max_created_after; }) | |
| .duration(function() { return (isInit) ? 0 : 600; }) | |
| .ease("bounce") | |
| .attr("r", function(d) { return Math.max(1, r(d.followers_count)); }); | |
| nodes.append("circle") | |
| .attr("class", "inner") | |
| .attr("id", function(d,i) { return "inner-" +i; }) | |
| .attr("cx", function(d) { return x(d.created_after); } ) | |
| .attr("cy", 100) | |
| .attr("r", 3) | |
| .style("fill", "#444444") | |
| .style("opacity", 0.0) | |
| .transition() | |
| .delay(function(d,i) { return (isInit) ? 0 : d.created_after * 500 / max_created_after; }) | |
| .duration(function() { return (isInit) ? 0 : 600; }) | |
| .style("opacity", 1.0); | |
| function created_after_toString(created_after){ | |
| var day = Math.floor(created_after / (60 * 60 * 24)); | |
| var remainder = created_after - day * (60 * 60 * 24); | |
| var hour = Math.floor(remainder / (60 * 60)); | |
| remainder -= hour * (60 * 60); | |
| var min = Math.floor(remainder / 60); | |
| remainder -= min * 60; | |
| var second = remainder; | |
| var out = ""; | |
| if(day > 0) out += day + " days "; | |
| if(hour > 0) out += hour + " hrs "; | |
| if(min > 0 && day==0) out += min + " mins "; | |
| if(second > 0 && hour==0) out += second + " secs "; | |
| if(created_after > 0) return out; | |
| else return "less than a second"; | |
| } | |
| nodes.append("rect") | |
| .attr("fill-opacity", 0.0) | |
| .attr("x", function(d,i) { | |
| return (i == 0) ? 0 : | |
| (x(data.nodes[i-1].created_after) + x(data.nodes[i].created_after)) / 2.0; | |
| }) | |
| .attr("width", function(d,i) { | |
| x1 = (i == 0) ? 0 : | |
| (x(data.nodes[i-1].created_after) + x(data.nodes[i].created_after)) / 2.0; | |
| x2 = (i == data.nodes.length - 1) ? width : | |
| (x(data.nodes[i].created_after) + x(data.nodes[i+1].created_after)) / 2.0; | |
| return x2 - x1; | |
| }) | |
| .attr("y", 100 - 25) | |
| .attr("height", 100) | |
| .style("cursor", "hand") | |
| .on("mouseover", function(d, i) { | |
| var xpos = x(d.created_after); | |
| var radius = Math.max(1, r(d.followers_count)); | |
| timeline.select("circle#inner-" + i).style("fill", "#993333"); | |
| timeline.select("circle#outer-" + i) | |
| .style("visibility", "visible") | |
| .style("stroke", "#993333"); | |
| if (i > 0) { | |
| timeline.append("line") | |
| .attr("class", "time_label") | |
| .attr("x1", xpos) | |
| .attr("y1", 100) | |
| .attr("x2", xpos) | |
| .attr("y2", 100 + 67) | |
| .style("stroke", "#444444") | |
| .style("stroke-width", 0.5); | |
| timeline.append("text") | |
| .attr("class", "time_label") | |
| .text(created_after_toString(d.created_after)) | |
| .attr("x", xpos) | |
| .attr("dx", 5) | |
| .attr("y", 100 + 67) | |
| .attr("dy", "-0.1em") | |
| .attr("text-anchor", "start") | |
| .style("fill", "#444444") | |
| .style("font-size", "12px"); | |
| } | |
| var count_label = timeline.append("text").text(addCommas(d.followers_count) + " followers"); | |
| var bbox = count_label.node().getBBox(); | |
| var rect_w = bbox.width + 6; | |
| var rect_h = bbox.height + 2; | |
| count_label.remove(); | |
| timeline.append("rect") | |
| .attr("class", "user_label") | |
| .attr("x", xpos - rect_w / 2) | |
| .attr("y", 85 - radius - rect_h / 2) | |
| .attr("width", rect_w) | |
| .attr("height", rect_h) | |
| .style("fill", "#FFFFFF"); | |
| timeline.append("text") | |
| .attr("class", "user_label") | |
| .text(addCommas(d.followers_count) + " followers") | |
| .attr("x", xpos) | |
| .attr("y", 85 - radius) | |
| .attr("dy", "0.4em") | |
| .attr("text-anchor", "middle") | |
| .style("fill", "#77A396"); | |
| showtt("@" + d.screen_name); | |
| timeline.selectAll("path") | |
| .style("stroke-opacity", function(e, j) { | |
| if((e.from != i) && (e.to != i)) | |
| return 0.05; | |
| else | |
| return 0.5; | |
| }); | |
| }) | |
| .on("mousemove", function(d, i){ | |
| movett(); | |
| }) | |
| .on("mouseout", function(d, i){ | |
| timeline.select("circle#inner-" + i).style("fill", "#444444"); | |
| timeline.select("circle#outer-" + i) | |
| .style("stroke", "none"); | |
| if(i > 0) timeline.selectAll(".time_label").remove(); | |
| timeline.selectAll(".user_label").remove(); | |
| hidett(); | |
| timeline.selectAll("path").style("stroke-opacity", 0.2); | |
| }) | |
| .on("click", function(d, i){ | |
| window.open("http://www.twitter.com/" + d.screen_name, "_blank"); | |
| }); | |
| timeline.append("line") | |
| .attr("x1", x(0)) | |
| .attr("y1", 100) | |
| .attr("x2", x(0)) | |
| .attr("y2", 100 + 100) | |
| .style("stroke", "#444444") | |
| .style("stroke-width", 0.5); | |
| var date_iso = d3.time.format("%Y-%m-%dT%H:%M:%S"); | |
| var date_pretty = d3.time.format("%I:%M %p - %d %b %y"); | |
| timeline.append("text") | |
| .text(date_pretty(new Date(date_iso.parse(data.tweet.created_at) - 60000 * (new Date().getTimezoneOffset())))) | |
| .attr("x", x(0)) | |
| .attr("dx", 5) | |
| .attr("y", 100 + 100) | |
| .attr("dy", "-0.1em") | |
| .attr("text-anchor", "start") | |
| .style("fill", "black") | |
| .style("font-size", "20px"); | |
| timeline.append("text") | |
| .text("rescale") | |
| .attr("x", width-100) | |
| .attr("dx", 0) | |
| .attr("y", 100 + 100) | |
| .attr("dy", "-0.1em") | |
| .attr("text-anchor", "end") | |
| .style("cursor", "hand") | |
| .style("fill", "#666666") | |
| .style("font-size", "14px") | |
| .on("mouseover", function(d,i) { | |
| d3.select(this).style("fill", "#77A396"); | |
| }) | |
| .on("mouseout", function(d,i) { | |
| d3.select(this).style("fill", "#666666"); | |
| }) | |
| .on("click", function(d,i) { | |
| isEvenSpaced = !isEvenSpaced; | |
| d3.selectAll("svg").remove(); | |
| plot(data, isEvenSpaced); | |
| }); | |
| isInit = true; | |
| } | |
| </script> | |
| </body> |