D3.js的應(yīng)用:星巴克全球店址可視圖

作為一個(gè)數(shù)據(jù)分析的新手细层,最近我也在kaggle上晃蕩,不過(guò)主要是觀摩大師以及尋找有趣的數(shù)據(jù)集的唬涧。這不疫赎,今天早上發(fā)現(xiàn)了一個(gè)星巴克的數(shù)據(jù)集,下載下來(lái)后碎节,發(fā)現(xiàn)自帶經(jīng)緯度捧搞,就打算用剛學(xué)不久,還熱乎的d3.js來(lái)做個(gè)可視化狮荔。

先上最終成果—— Starbucks Locations Worldwide
(鼠標(biāo)放在綠點(diǎn)上會(huì)顯示店名和店鋪的地址)

截圖也來(lái)一張(有沒有覺得我的配色很友好=胎撇。=):


星巴克全球店址

源碼都放在了我的github上:Starbucks Locations Worldwide on github

制作心得

注意:這個(gè)可視化使用的是d3的v4版

首先在把點(diǎn)畫上去之前,先要把一幅地圖放在頁(yè)面上殖氏。這時(shí)候就導(dǎo)入我提前準(zhǔn)備好的world_countries.json文件晚树,這個(gè)文件生成自http://geojson.io/,它里面包含了不同國(guó)家地區(qū)的經(jīng)緯度雅采,就能在畫布上畫出一個(gè)地球爵憎。

添加svg的過(guò)程就不贅述了,具體來(lái)說(shuō)下怎么畫出地球和添加點(diǎn)婚瓜。

第一步: 設(shè)定投影方法和位置

利用d3.geoMercator()把地圖平面投影化宝鼓,為了接下來(lái)能畫在2維的畫布上。

var projection =  d3.geoMercator()
                               .scale(200)//根據(jù)個(gè)人喜好縮放
                               .translate( [760, 470]); //決定了投影的中心巴刻,根據(jù)個(gè)人喜好調(diào)整

第二步: 鏈接路徑

var path = d3.geoPath().projection(projection);

這行代碼雖短愚铡,但卻至關(guān)重要,因?yàn)樗鶕?jù)之前設(shè)置的投影胡陪,生成了了一個(gè)SVG的路徑數(shù)據(jù)串沥寥,簡(jiǎn)單點(diǎn)說(shuō),就是把路徑添加到了畫布上柠座,我們能開始作畫了邑雅!

附上英文解釋:

The geographic path generator, d3.geoPath, is similar to the shape generators in d3-shape: given a GeoJSON geometry or feature object, it generates an SVG path data string or renders the path to a Canvas. Canvas is recommended for dynamic or interactive projections to improve performance. Paths can be used with projections or transforms, or they can be used to render planar geometry directly to Canvas or SVG.

第三步:讀取地圖數(shù)據(jù)

        var map = svg.selectAll('path') 
                     .data(geo_data.features)// 加入我們地圖文件geo_data中的特征
                     .enter() 
                     .append('path') //添加到我們?cè)O(shè)置的路徑
                     .attr('d', path)
                     .style('fill', '#b3cccc') // 填充顏色
                     .style('stroke', 'black') //邊界線長(zhǎng)度
                     .style('stroke-width', 0.4); // 邊界線寬度

大功告成!地圖已經(jīng)畫在了頁(yè)面上愚隧。

第四步:添加點(diǎn)

        svg.selectAll("circle")
            .data(data) //這里的data是指我們的星巴克店址的data
            .enter()
            .append("circle")
            .attr("cx", function(d) {
                      return projection([ +d["Longitude"]]);
                      })
            .attr("cy", function(d) {
                      return projection([ +d["Latitude"] ]);
                      })
            .attr("r", 2.2)
            .attr("fill", "#007245")
            .attr('opacity', 0.6)

這是d3.js在畫布中添加點(diǎn)最常用的方法蒂阱,在這里點(diǎn)的橫坐標(biāo)和縱坐標(biāo)就是對(duì)應(yīng)著我們的經(jīng)緯度锻全。因此狂塘,我也需要把經(jīng)緯度按照我們之前投影地圖的方式轉(zhuǎn)化录煤,這樣才能正確的顯示在我們2d的地圖中。[ +d["Longitude"]]這個(gè)寫法的功能就是把longitude列中的字符串轉(zhuǎn)化成數(shù)字荞胡。再用projection()給這個(gè)數(shù)值做個(gè)投影妈踊。

這樣,所有的點(diǎn)就出現(xiàn)在地圖上啦泪漂,大功告成廊营!

第五步:美化

我還對(duì)可視化做了一點(diǎn)美化,調(diào)整了地圖的位置萝勤,修改了樣式露筒,添加了標(biāo)題,以及鼠標(biāo)懸停顯示店鋪名和地點(diǎn)的功能敌卓。

參考文章

Mapping Data with D3

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末慎式,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子趟径,更是在濱河造成了極大的恐慌瘪吏,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜗巧,死亡現(xiàn)場(chǎng)離奇詭異掌眠,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)幕屹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門蓝丙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人望拖,你說(shuō)我怎么就攤上這事迅腔。” “怎么了靠娱?”我有些...
    開封第一講書人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵沧烈,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我像云,道長(zhǎng)锌雀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任迅诬,我火速辦了婚禮腋逆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘侈贷。我一直安慰自己惩歉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著撑蚌,像睡著了一般上遥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上争涌,一...
    開封第一講書人閱讀 52,394評(píng)論 1 310
  • 那天粉楚,我揣著相機(jī)與錄音,去河邊找鬼亮垫。 笑死模软,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的饮潦。 我是一名探鬼主播燃异,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼继蜡!你這毒婦竟也來(lái)了回俐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤壹瘟,失蹤者是張志新(化名)和其女友劉穎鲫剿,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體稻轨,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡灵莲,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了殴俱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片政冻。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖线欲,靈堂內(nèi)的尸體忽然破棺而出明场,到底是詐尸還是另有隱情,我是刑警寧澤李丰,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布苦锨,位于F島的核電站,受9級(jí)特大地震影響趴泌,放射性物質(zhì)發(fā)生泄漏舟舒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一嗜憔、第九天 我趴在偏房一處隱蔽的房頂上張望秃励。 院中可真熱鬧,春花似錦吉捶、人聲如沸夺鲜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)币励。三九已至慷蠕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間榄审,已是汗流浹背砌们。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工杆麸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留搁进,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓昔头,卻偏偏與公主長(zhǎng)得像饼问,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子揭斧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容