【D3.js in Action 3 精譯】1.2.2 可縮放矢量圖形(二)

當前內容所在位置

  • 第一部分 D3.js 基礎知識
    • 第一章 D3.js 簡介
      • 1.1 何為 D3.js?
      • 1.2 D3 生態系統——入門須知
        • 1.2.1 HTML 與 DOM
        • 1.2.2 SVG - 可縮放矢量圖形 ??
          • 第一部分
          • 【第二部分】??
          • 第三部分(精譯中 ?)
        • 1.2.3 Canvas 與 WebGL(待翻譯)
        • 1.2.4 CSS(待翻譯)
        • 1.2.5 JavaScript(待翻譯)
        • 1.2.6 Node 與 JavaScript 框架(待翻譯)
        • 1.2.7 Observable 記事本(待翻譯)

譯注
(接 1.2.2 小節(一))
……正如您看到的那樣,viewBox 屬性由四個屬性值組成。前兩個數值指定了 viewBox 的坐標系原點(xy)。本書將統一使用 0 0,知道這些值可以調整 SVG 容器在屏幕的可見部分還是很有幫助的。viewBox 后兩個數值分別指定了寬度(width)和高度(height)。它們定義了 SVG 的寬高比,并確保它能完美適應任何容器并作相應縮放而不致失真。

(……而不致失真。)這里的關鍵是讓 SVG 的尺寸與容器相適應。此時 SVG 所在容器為 <body> 元素,而 <body> 的尺寸又常常與瀏覽器視口(viewport)相適應。如果視口變得非常大,SVG 也會相應變大。通常,SVG 需要一個最大寬度,以免寬度超過頁面上的其他內容。因此,SVG 需要放進一個 div 里面,并讓該 div 的寬度為 100%、最大寬度為 1200px。為簡便起見,我們將這些樣式設為行內樣式;實際項目中,它們都應該來自某個 CSS 文件。注意,為了讓 SVG 水平居中,還多加了一個值為 0 auto 的外邊距:

<div style="width:100%; max-width:1200px; margin:0 auto;"><svg viewBox="0 0 900 300" style="border:1px solid black;"> ... </svg>
</div>

改好后,再次調整瀏覽器大小,看看 SVG 是否能在保持最大寬度的情況下優雅適應任意屏幕大小。該方案有助于將 D3 可視化模塊注入到響應式網頁中,本書后續都將采用該方案進行演示。

2 SVG 的坐標系

實現 SVG 的響應式設計后,接下來需要重點考慮 SVG 圖形在容器內的定位問題。SVG 容器就像一個空白畫布,我們可以在上面繪制矢量圖形。矢量圖形是根據基本幾何原理定義的,并相對于 SVG 容器的坐標系進行定位。

SVG 坐標系類似于直角坐標系,其二維平面通過兩個相互垂直的軸來定位元素,即 x 軸和 y 軸;這兩個軸的起點均為 SVG 容器的 左上角,如圖 1.11 所示。y 軸的正方向為 從上到下,記住它可以少走很多彎路。

圖 1.11 SVG 容器坐標系與元素位置圖 1.11 SVG 容器坐標系與元素位置

要在 SVG 容器內定位一個元素,可以從左上角的原點開始向右移動。這樣就得到了元素的水平位置(即 x);垂直位置(即 y)則從頂部開始向下移動。這些位置信息均由 SVG 圖形的呈現屬性(presentational attributes)來定義。

下面來看看構建 D3 項目常見的 SVG 圖形及其主要的呈現屬性。我們的目標并不是編寫一份涵蓋所有 SVG 圖形及其功能特性的全方位指南,而是希望這些基礎知識不會在后續的 D3 學習中拖您后腿。

數據可視化小知識:幾何基元(Geometric primitives)

出色的藝術家可以用矢量圖形來繪制任何事物,但您可能是帶著更實際的目標來學習 D3 的。從這個角度來看,理解幾何基元(也稱圖形基元,graphical primitives)的概念至關重要。幾何基元是一些簡單的形狀,如點、線、圓和矩形。這些圖形可以組合成更復雜的圖形,尤其便于直觀地展示信息。

幾何基元對于理解現實世界中復雜的信息可視化也很有用。比如本書第 11 章要構建的樹形布局,在您意識到它們也不過是一些圓和線時,也就不會那么令人生畏了;當您把交互式時間線看作是矩形和點的集合時,它們就更容易理解和創建了;即使是主要以多邊形、點和線的形式出現的地理數據,如果將其分解為最基本的圖形結構,也就不會那么令人困惑了。

3 直線

直線元素可能是所有 SVG 圖形中最簡單的。它需要兩個點的位置信息作屬性值,并在它們之間繪制出一條直線。回到 index.html 示例文件,在 SVG 容器內添加一個 <line /> 元素,并令其 x1y1 屬性分別為 5045。也就是說,該直線的起點位于 SVG 坐標系的 (50, 45)。如果從 SVG 容器的左上角開始,右移 50px、下移 45px,就會到達該起點;同理,利用屬性 x2y2 可將該直線的終點坐標設為 (140, 225),如圖 1.12 所示。

<svg><line x1="50" y1="45" x2="140" y2="225" />
</svg>

圖 1.12 在 SVG 容器坐標系中定位直線元素圖 1.12 在 SVG 容器坐標系中定位直線元素

如果保存并重新加載項目,會發現直線不可見——要讓它可見,還需要設置其 stroke 屬性(attribute)。stroke 用于控制直線段的描邊顏色,其值與 CSS 的 color 屬性(property)類似;該取值可以是一個顏色名稱(blackblue …)、一個 RGB 顏色值(rgb(255,0,0))或一個十六進制值(#808080)。給直線段添加一個 stroke 描邊屬性,并選擇合適的顏色(示例為黑色),應該就能顯示了:

<line x1="50" y1="45" x2="140" y2="225" stroke="black" />

要設置線條寬度,使用 stroke-width 屬性。該屬性可接受一個絕對數(轉換為像素)或一個相對值(%)。例如下面一行代碼,直線的 stroke-width3px。如果未聲明 stroke-width ,瀏覽器將默認取 1px

<line x1="50" y1="45" x2="140" y2="225" stroke="black" stroke-width="3" />

打開瀏覽器的檢查工具(Inspect),找到 SVG 節點及其包含的直線。雙擊其中一個屬性并修改它的值,觀察新的屬性值對直線起點或終點的影響。再嘗試不同的值,以確認您充分理解了屬性 x1y1x2y2 對直線位置和長度的影響。

接著,令 x1 屬性值為 -20,如圖 1.13 所示:

圖 1.13 直線在 SVG 容器外的部分被隱藏圖 1.13 直線在 SVG 容器外的部分被隱藏

看到直線的起點消失了嗎? 在 SVG 中,任何位于 viewBox 之外的形狀(或形狀的一部分)在屏幕上都是不可見的。 此時該元素仍然在 DOM 中,并且可以訪問和操作。當 SVG 元素不可見,而您又不清楚原因時,則需要首先檢查該元素是否在 SVG 的 viewBox 之外!請牢牢記住,您可以隨時通過開發工具查看 DOM 來找到它。前面講過,在檢查工具中只要將鼠標放到該元素上,就算它在 SVG 的 viewBox 之外,也會在視口中高亮顯示。

注意

大多數 SVG 元素只需要一個自閉合標簽即可(如使用 <line /> 而非 <line></line>)。與其他一些 HTML 標簽一樣,SVG 元素的固有結構在它們的自閉合標簽內已經提供了所有必要的信息;但文本元素屬于例外——其文本須放到開閉標簽之間。

4 矩形

矩形元素 <rect />,顧名思義,會在屏幕上畫出一個矩形。<rect /> 元素需要四個屬性(attributes)才能正常顯示。如圖 1.14 所示,屬性 xy 聲明了矩形左上角的位置;屬性 widthheight 分別控制其寬度和高度。在 SVG 容器中添加以下 <rect /> 元素及其屬性:

<rect x="260" y="25" width="120" height="60"  fill="#6ba5d7" />

示例中,矩形的左上角位于 SVG 容器原點的右側 260px ,下方 25px;該矩形寬 120px ,高 60px。與其他定位屬性一樣,這些屬性值也可以用百分比來進行設置。例如將 width 設置為 50%,則該矩形將占據 SVG 容器寬度的一半。

圖 1.14 在 SVG 坐標系中定位和調整矩形尺寸圖 1.14 在 SVG 坐標系中定位和調整矩形尺寸

您或許注意到了,示例中的矩形被填充成了黑色。默認情況下,瀏覽器會將大多數 SVG 圖形填充為黑色。要修改默認的填充色,可以設置元素的 fill 屬性,令其值為任意 CSS 顏色值即可;要給矩形添加邊框,則可以添加 stroke 屬性。圖 1.15 展示了幾個例子。注意,如果不聲明 stroke 屬性,則矩形四周不會描邊。此外,在最后一個示例矩形中,屬性 fill-opacitystroke-opacity 可分別令 fillstroke 屬性變為半透明效果。與 CSS 一樣,不透明程度(opacity)可設為絕對值(介于 01 之間)或百分比(30%);與填充和描邊相關的所有屬性也都可以通過 CSS 文件進行設置或修改。

圖 1.15 應用于矩形 SVG 圖形的不同樣式屬性圖 1.15 應用于矩形 SVG 圖形的不同樣式屬性

如果想繪制帶圓角的矩形,只需添加 rxry 屬性即可,分別表示水平與垂直角半徑。這些屬性接受絕對值(像素)和相對值(百分比)。例如,下面矩形的每個角的半徑都是 20px。將該矩形添加到示例中:

<rect x="260" y="100" width="120" height="60" rx="20" ry="20"  fill="#6ba5d7" />

講到這您可能會問:SVG 中有沒有專門畫正方形的元素呢?答案是不需要——只要讓 <rect /> 元素 widthheight 屬性相同就行了。例如下面的 <rect /> 元素,最終將畫出一個 60px × 60px 的正方形。在示例頁中添加以下內容:

<rect x="260" y="175" width="60" height="60"  fill="transparent" stroke="#6ba5d7" />

作為參考,現在 SVG 畫廊里有三種矩形:經典矩形、圓角矩形以及正方形。為了增添趣味性,先將顏色統一設為 #6ba5d7 ,再來玩玩它們的 strokefill 屬性。注意,正方形上只有描邊(stroke)是可見的,因為其 fill 屬性值為 transparent(為 none 也是一樣的)。這些矩形應該與圖 1.16 相似,除非您更改了屬性值,我們也希望您改改看!

<rect x="260" y="25" width="120" height="60" fill="#6ba5d7" />
<rect x="260" y="100" width="120" height="60" rx="20" ry="20" fill="#6ba5d7" />
<rect x="260" y="175" width="60" height="60" fill="transparent" stroke="#6ba5d7" />

圖 1.16 三種 SVG 矩形效果圖 1.16 三種 SVG 矩形效果

關于 SVG 描邊(strokes)的位置

當對齊可視化項目中的圖形時,需要特別注意:SVG 圖形繪制出的描邊是在內外邊界上平均展布的。如下圖所示,已知一個 width 屬性為 40px 的矩形,令 stroke-width 的值為 1,則在視覺效果上會在矩形的左右兩邊各增加寬度為 0.5px 的描邊(而不是下意識地以為的那樣在各邊均增加 1px),最終實際的總寬度為 41px;若令 stroke-width 的值為 2,則左右兩邊各增加 1px,以此類推。

描邊寬度 stroke-width 對 SVG 圖形實際寬度的影響描邊寬度 stroke-width 對 SVG 圖形實際寬度的影響

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/36978.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/36978.shtml
英文地址,請注明出處:http://en.pswp.cn/web/36978.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

自動化任務:在IPython中創建和運行腳本

在數據科學和編程中&#xff0c;自動化任務是提高效率的關鍵。IPython提供了多種方法來創建和運行腳本&#xff0c;使得重復性任務可以被輕松自動化。本文將介紹如何在IPython中創建和運行腳本&#xff0c;幫助你更高效地完成工作。 1. 創建和保存IPython腳本 使用文本編輯器…

Spring Boot 中的微服務監控與管理

微服務的概述 微服務架構的優點和挑戰 優點: 靈活性和可擴展性:微服務架構允許每個服務單獨部署和擴展,這使得系統可以更靈活地適應不同的業務需求和負載變化。 使團隊更加聚焦:每個微服務都有明確的職責,這使得開發團隊可以更加聚焦,專注于開發他們的服務。 技術和框…

讀AI新生:破解人機共存密碼筆記16對人工智能的治理

1. 愚蠢的、情緒化的人類 1.1. 與完美理性所設定的不可企及的標準相比&#xff0c;我們都是極其愚蠢的&#xff0c;我們受制于各種情緒的起伏&#xff0c;這些情緒在很大程度上支配著我們的行為 1.2. 為了充分了解人類的認知&#xff0c;我們&#xff08;或者更確切地說&…

簡易跨平臺上傳文件,前后端demo

前端文件 <!DOCTYPE html> <html> <head><title>文件上傳</title> </head> <body> <h1>文件上傳1-相對慢&#xff0c;需要等待本地選擇的文件全部上傳完成后&#xff0c;服務器再保存</h1> <form id"uploadForm…

ORA-01775: 同義詞的循環鏈問題

一、問題描述 ORA-01775: 同義詞的循環鏈問題 二、 原因分析 同義詞對應的對象&#xff08;表等&#xff09;已刪除&#xff0c;不存在了。 可能原因&#xff1a; 刪除數據庫對象&#xff0c;但是忘記刪除同義詞。刪除一個用戶&#xff0c;但忘記刪除此用戶中相關的同義詞…

@Param參數

Param參數 當方法參數大于兩個的時候必須傳遞&#xff0c;只有一個的時候可以不傳。大于兩個的時候也可以用#{arg0}和#{arg1}。。。來取值 Param&#xff08;&#xff09;括號里面的值對應sql語句中 # {} 里面的值 看AI的解釋

模版方法模式詳解:使用和實現的指南

目錄 模版方法模式模版方法模式結構模版方法模式適合應用場景模版方法模式優缺點練手題目題目描述輸入描述輸出描述題解 模版方法模式 模板方法模式是一種行為設計模式&#xff0c; 它在超類中定義了一個算法的框架&#xff0c; 允許子類在不修改結構的情況下重寫算法的特定步…

《昇思25天學習打卡營第3天|張量 Tensor》

文章目錄 前言&#xff1a;今日所學&#xff1a;1. 創建張量2. 張量的屬性3.張量索引與運算4. NumPy與Tensor的轉換5. 稀疏張量 前言&#xff1a; 張量&#xff1f;張亮&#xff1f;張量是什么&#xff1f; 張量是一個可以用來表示在一些矢量、標量和其他張量之間的線性關系的…

高并發部署:基于 Gunicorn、Flask 和 Docker

一、準備工作 確保已經安裝以下軟件&#xff1a; DockerDocker ComposePython 3.x 二、創建 Flask 應用 首先&#xff0c;創建一個簡單的 Flask 應用。創建一個新的目錄并在其中創建以下文件&#xff1a; 1. app.py python fromflask importFlask, jsonifyapp Flask(__…

leetcode 第133場雙周賽 100333.統計逆序對的數目【計數dp/滾動數組/前綴和優化】

分析&#xff1a; 先考慮如下問題。 求長度為n&#xff0c;逆序對為m的排列數量。 可以考慮dp&#xff0c;dp[i][j]定義為長度為i&#xff0c;逆序對為j的排列數量。 dp[1][0] 1; //枚舉排列長度&#xff0c;或者認為枚舉當前需要插到長度為i-1的排列中的數字 for(int i 1…

OpenAI封殺不支持地區API:違規封號,7月9日生效

OpenAI 在檢測用戶使用其 API 的地區后&#xff0c;提示所有不支持位置的用戶 昨晚&#xff0c;很多大模型應用的開發者、程序員都收到了 OpenAI 的警告信&#xff0c;心里一驚。 OpenAI 在檢測用戶使用其 API 的地區后&#xff0c;提示所有不支持位置的用戶&#xff1a;即將封…

冒泡排序、選擇排序、插入排序~java版

1、冒泡排序&#xff08;Bubble Sort&#xff09; 冒泡排序的基本思想是多次遍歷待排序序列&#xff0c;每次遍歷時兩兩比較相鄰元素&#xff0c;如果順序不對則交換&#xff0c;直到整個序列有序為止。 public class BubbleSort {public static void bubbleSort(int[] arr) …

圖書管理系統(附源碼)

前言&#xff1a;前面一起和小伙伴們學習了較為完整的Java語法體系&#xff0c;那么本篇將運用這些知識連串在一起實現圖書管理系統。 目錄 一、總體設計 二、書籍與書架 書籍&#xff08;Book&#xff09; 書架&#xff08;Booklist&#xff09; 三、對圖書的相關操作 I…

已解決問題 | 該擴展程序未列在 Chrome 網上應用店中,并可能是在您不知情的情況下添加的

在Chrome瀏覽器中&#xff0c;如果你看到“該擴展程序未列在 Chrome 網上應用店中&#xff0c;并可能是在您不知情的情況下添加的”這樣的提示&#xff0c;通常是因為該擴展程序沒有通過Chrome網上應用店進行安裝。以下是解決這個問題的步驟&#xff1a; 解決辦法&#xff1a;…

Spring Boot整合Redis緩存的最佳實踐

Spring Boot整合Redis緩存的最佳實踐 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 在現代應用開發中&#xff0c;緩存是提升系統性能和響應速度的關鍵技術之…

kali/ubuntu安裝vulhub

無須更換源&#xff0c;安裝docker-compose apt install docker.io docker -vdocker-compose #提示沒有&#xff0c;輸入y安裝mkdir -p /etc/docker vi /etc/docker/daemon.json #更換dockerhub國內源┌──(root?kali)-[/home/kali/vulhub-master/tomcat/CVE-2017-12615] …

【VScode】常規插件安裝

以下是VScode常規插件安裝&#xff1a; C/C C/C extension pack C/C themes Draw.io integration highlight 以上插件安裝完畢后&#xff0c;可實現 字體高亮&#xff0c;自動補齊&#xff0c;函數跳轉&#xff0c;主題切換&#xff0c;圖表生成等常用功能。

中介子方程三十七

XXFXXuXXWXXuXXdXXrXXαXXuXpXXKXηXiXXnXXyXηXyXXnXXiXηXKXXpXuXXαXXrXXdXXuXWXπXXWXeXyXeXbXπXpXXNXXqXeXXrXXαXXuXpXXKXηXiXXnXXyXηXyXXnXXiXηXKXXpXuXXαXXrXXeXqXXNXXpXπXbXeXyXeXWXXπXWXuXXdXXrXXαXXuXpXXKXηXiXXnXXyXηXyXXnXXiXηXKXXpXuXXαXXrXXdXXuXXW…

【TensorFlow深度學習】對比學習的核心:實例與上下文的對抗

對比學習的核心&#xff1a;實例與上下文的對抗 對比學習概述實例與上下文的對抗&#xff1a;核心機制實戰代碼示例&#xff1a;使用PyTorch實現SimCLR結語 在深度學習的浩瀚星海中&#xff0c;對比學習作為自我監督學習的一個分支&#xff0c;正以破竹之勢引領著無標注數據利用…

dledger原理源碼分析系列(三)-選主

簡介 dledger是openmessaging的一個組件&#xff0c; raft算法實現&#xff0c;用于分布式日志&#xff0c;本系列分析dledger如何實現raft概念&#xff0c;以及dledger在rocketmq的應用 本系列使用dledger v0.40 本文分析dledger的選主 關鍵詞 Raft Openmessaging 心跳/選…