1. 程式人生 > >【 D3.js 進階系列 — 4.0 】 繪製箭頭

【 D3.js 進階系列 — 4.0 】 繪製箭頭

在 SVG 繪製區域中作圖,在繪製直線和曲線時,常需要在某處新增箭頭。本文介紹如何在 D3 中給直線和曲線新增箭頭。

 401

到目前為止,我們繪製 D3 的圖表都是在 SVG 繪製區域內,雖然 D3 也可用 Canvas 或 WebGL 等作圖,但 SVG 是最常用的。那麼,用 D3 來繪製箭頭,先要明白在 SVG 中是怎麼繪製的。

1. 在 SVG 中定義箭頭的標識

定義箭頭的標識如下,先寫一對 <defs> ,裡面再寫一對 <marker>,其中 marker 的屬性的意義為:

viewBox座標系的區域
refX, refY在 viewBox 內的基準點,繪製時此點在直線端點上(要注意大小寫)
markerUnits標識大小的基準,有兩個值:strokeWidth(線的寬度)和userSpaceOnUse(圖形最前端的大小)
markerWidth, markerHeight標識的大小
orient繪製方向,可設定為:auto(自動確認方向)和 角度值
id標識的id號

然後在 marker 裡繪製圖形即可,下面的程式碼中用 path 繪製了一個箭頭的圖形。

<defs>
<marker id="arrow" 
		markerUnits="strokeWidth" 
		markerWidth="12" 
		markerHeight="12" 
		viewBox="0 0 12 12" 
		refX="6" 
		refY="6" 
		orient="auto">
        <path d="M2,2 L10,6 L2,10 L6,6 L2,2" style="fill: #000000;" />
</marker>
</defs>
 

2. 在 SVG 中繪製箭頭

有了上面的標識,就可以繪製箭頭了。下面繪製一條線段,線上段末尾新增箭頭:

<line x1="0" y1="0" x2="200" y2="50"  stroke="red" stroke-width="2" marker-end="url(#arrow)"/>

也可以用 path 來繪製:

<path d="M20,70 T80,100 T160,80 T200,90" fill="white" stroke="red" stroke-width="2" marker-start="url(#arrow)" marker-mid="url(#arrow)" marker-end="url(#arrow)"/>

在不同的位置繪製的屬性如下:

  • marker-start :路徑起點處
  • marker-mid:路徑中間端點處(必須是 path 中間出現的點)
  • marker-end :路徑終點處

3. 使用 D3 繪製箭頭

有了上面的內容,在 D3 中如何繪製呢?

先定義箭頭的標識:

var svg = d3.select("body").append("svg")
	    .attr("width", width)
	    .attr("height", height);
		
var defs = svg.append("defs");

var arrowMarker = defs.append("marker")
						.attr("id","arrow")
						.attr("markerUnits","strokeWidth")
					    .attr("markerWidth","12")
                        .attr("markerHeight","12")
                        .attr("viewBox","0 0 12 12") 
                        .attr("refX","6")
                        .attr("refY","6")
                        .attr("orient","auto");

var arrow_path = "M2,2 L10,6 L2,10 L6,6 L2,2";
						
arrowMarker.append("path")
			.attr("d",arrow_path)
			.attr("fill","#000");

使用上述 marker 繪製箭頭的程式碼為:

//繪製直線
var line = svg.append("line")
			 .attr("x1",0)
			 .attr("y1",0)
			 .attr("x2",200)
			 .attr("y2",50)
			 .attr("stroke","red")
			 .attr("stroke-width",2)
			 .attr("marker-end","url(#arrow)");

//繪製曲線
var curve_path = "M20,70 T80,100 T160,80 T200,90";

var curve = svg.append("path")
			 .attr("d",curve_path)
			 .attr("fill","white")
			 .attr("stroke","red")
			 .attr("stroke-width",2)
			 .attr("marker-start","url(#arrow)")
			 .attr("marker-mid","url(#arrow)")
			 .attr("marker-end","url(#arrow)");

結果圖為本文開始處的圖片,完整程式碼為:

謝謝閱讀。

文件資訊

  • 發表日期:2014 年 12 月 8 日
  • 備註:本文發表於 OUR D3.JS ,轉載請註明出處,謝謝

相關推薦

D3.js 系列4.0 繪製箭頭

在 SVG 繪製區域中作圖,在繪製直線和曲線時,常需要在某處新增箭頭。本文介紹如何在 D3 中給直線和曲線新增箭頭。 到目前為止,我們繪製 D3 的圖表都是在 SVG 繪製區域內,雖然 D3 也可用 Canvas 或 WebGL 等作圖,但 SVG 是最常用的。那麼,用 D3

D3.js 系列 — 1.0 CSV 表格檔案的讀取

在入門系列的教程中,我們常用 d3.json() 函式來讀取 json 格式的檔案。json 格式很強大,但對於普通使用者可能不太適合,普通使用者更喜歡的是用 Microsoft Excel 或 OpenOffice Calc 等生成的表格檔案,因為簡單易懂,容易編輯。

D3.js 系列 — 2.1 力學圖的事件 + 頂點的固定

本章討論在力學圖中常用到的事件( Event ),然後對【進階 - 第 2.0 章】的人物關係圖進行改進,使使用者能夠固定拖拽的物件。 force.on("tick", function(){ });這裡的 force 是之前程式碼中定義的佈局( Layout )

D3.js 系列 — 1.1 其他表格檔案的讀取

CSV 表格檔案是以逗號作為單元分隔符的,其他還有以製表符 Tab 作為單元分隔符的 TSV 檔案,還有人為定義的其它分隔符的表格檔案。本文將說明在 D3 中如何讀取它們。   1. TSV 表格檔案是什麼 TSV(Tab Separated Values),製表分隔值,它

D3.js 系列 — 6.2 餅狀圖的拖拽

本文講解稍微複雜一些的拖拽應用,即拖拽餅圖的各部分。在【入門 - 第 9.1 章】講解了如何製作餅狀圖。餅狀圖的各部分是用具有寬度的弧線來表示的。在與使用者進行互動的時候,如果每一部分都能拖拽,是很有趣的。1.餅狀圖的繪製與【入門 - 第 9.1 章】稍有有些不同,我們對餅狀

D3.js 系列 總結

進階系列的文章從去年10月開始寫的,晃眼又是4個多月了,想在年前總結一下。首先恭祝大家新年快樂。今年是羊年吧。前段時間和朋友聊天,聊到十二生肖裡為什麼沒貓,我張口就道:不是因為十二生肖開會的時候貓遲到了嗎?呵呵,不知道這是誰給我灌輸的觀點。o(>﹏<)o進階系列的

D3.JS資料視覺化實戰記錄繪製動態狀態變化趨勢圖

參考d3js.org的Health&Wealth例項(http://bost.ocks.org/mike/nations/)按照時間展示節點狀態變化。 需要展示的json: [{"calendar":"2012-01-01 12:00:00", "value

1-4JavaScript深入之帶你走進記憶體機制

本期的主題是呼叫堆疊,本計劃一共28期,每期重點攻克一個面試重難點,如果你還不瞭解本進階計劃,文末點選檢視全部文章。 如果覺得本系列不錯,歡迎點贊、評論、轉發,您的支援就是我堅持的最大動力。 JS記憶體空間分為棧(stack)、堆(heap)、池(一般也會歸類為棧中)。 其中棧存放變數,堆存放複雜物件

3-4深度解析bind原理、使用場景及模擬實現

本週的主題是this全面解析,本計劃一共28期,每期重點攻克一個面試重難點,如果你還不瞭解本進階計劃,文末點選檢視全部文章。 如果覺得本系列不錯,歡迎點贊、評論、轉發,您的支援就是我堅持的最大動力。 bind() bind() 方法會建立一個新函式,當這個新函式被呼叫時,它的 this 值是傳

3-4深度解析bind原理、使用場景及模擬實現(轉)

這是我在公眾號(高階前端進階)看到的文章,現在做筆記  https://github.com/yygmind/blog/issues/23 bind() bind() 方法會建立一個新函式,當這個新函式被呼叫時,它的 this 值是傳遞給 bind(

ROS Rikirobot系列如何自己構建Rikirobot的環境

Rikirobot小車是一款全開源的ROS智慧小車,開源包括硬體原理圖、底層驅動板的程式碼、上位機程式碼,因此使用者可以很方便的移植構建自己的Rikirobot系統,這裡給大家介紹一下怎麼構建Rikirobot的上層環境,這裡的構建是針對有我們小車的使用者。

JS系列-JS執行期上下文(一)

❝ 點贊再看,年薪百萬 本文已收錄至https://github.com/likekk/-Blog歡迎大家star

python3的之路二因特網客戶端編程

網絡流 message world! 3.6 login 三元組 移除 元組 類對象 一、文件傳輸 1.1 文件傳輸因特網協議 最流行的協議包括文件傳輸協議(FTP)、UNIX到UNIX復制協議(UUCP)、用於Web的超文本傳輸協議(HTTP)。另外,還有(U

vtk.js學習筆記(2)繪製紋理深度圖

在vtk.js學習筆記(1)中搭建好了vtk.js的開發環境,並繪製了一個圓錐,這篇筆記將通過繪製一個帶深度資訊的紋理圖繼續學習vtk.js,實際效果如下圖所示。1、通過vtkElevationReader實現帶深度資訊的紋理對映import vtkTexture from

D3.js 入門系列 --- 9.4 集群圖的制作

all users bject nodes -- 部分 函數 選擇 water 本人的個人博客為: www.ourd3js.com csdn博客為: blog.csdn.net/lzhlzz 轉載請註明出處,謝謝。

D3.js 高階系列 — 5.0 顏色

顏色是作圖不可少的概念,常用的標準有 RGB 和 HSL,D3 提供了建立顏色物件的方法,能夠相互轉換和插值。RGB色彩模式是通過對紅(Red)、綠(Green)、藍(Blue)三個顏色通道相互疊加來得到各式各樣的顏色。三個通道的值的範圍都為0~255,因此總共能表示1677

Vue.js2-0Vue 建構函式的引數

Vue的建構函式至關重要! 裡面的引數也數量眾多,完整的引數列表可以參考:官方的Vue建構函式API 這篇文章以超級大白話,超級簡單的程式碼展示了Vue的建構函式、建構函式的引數、執行過程等等,可以說非常棒的一篇文章! 這裡僅僅把最常用的引數,以及這背後的Vue理念

D3.js 高階系列 — 6.0 值域和顏色

在【入門 - 第 10 章】作了一張中國地圖,其中各省份的顏色值都是隨意賦值的。如果要將一些值反映在地圖上,可以利用顏色的變化來表示值的變化。1. 思路例如,有值域的範圍為:[10, 500]現希望10用淺綠表示,500用深綠表示,10到500之間的值用淺綠和深綠之間的顏色表

8C++系列(過載)

1、過載規則 c++幾乎可以過載全部的運算子,而且只能夠過載c++已有的運算子。 其中,不能過載的運算子:"." 、 ".*" 、"::"、"?:" 過載之後運算子的優先順序和結合性都不會改變。 運算子過載是針對新型資料的實際需要,對原有運算子進行適當的改造。例如: 使複數的物件

7C++系列(類的繼承與派生)

1、繼承的概念 繼承:在儲存原有類的屬性和功能的基礎上,擴充套件新的功能。 開發類庫的團隊和使用類庫的團隊很可能不是一個,有些東西是不能訪問的。 繼承和派生是同一個問題的不同視角: 保持已有類的特性而構建新類的過程成為繼承;在已有類的基礎上新增自己的特性而產生新類的過程叫做派生。