1. 程式人生 > >【 D3.js 高階系列 — 5.0 】 顏色

【 D3.js 高階系列 — 5.0 】 顏色

顏色是作圖不可少的概念,常用的標準有 RGB 和 HSL,D3 提供了建立顏色物件的方法,能夠相互轉換和插值。

501

RGB色彩模式是通過對紅(Red)、綠(Green)、藍(Blue)三個顏色通道相互疊加來得到各式各樣的顏色。三個通道的值的範圍都為0~255,因此總共能表示16777216(256 * 256 * 256)種,即一千六百多萬種。幾乎包括了人類所能識別的所有顏色,是最廣泛也是最容易理解的顏色系統之一。

HSL色彩模式是通過對色相(Hue)、飽和度(Saturation)、明度(Lightness)三個通道的相互疊加來得到各種顏色的。其中,色相的範圍為0°~360°,飽和度的範圍為0~1,明度的範圍為0~1。色相的取值是一個角度,每個角度可以代表之中顏色,需要記住的是0°或360°代表紅色,120°代表綠色,240°代表藍色。飽和度的數值越大,顏色越鮮豔,灰色越少。明度值用於控制色彩的明暗變化,值越大,越明亮,越接近於白色;值越小,越暗,越接近黑色。

RGB顏色和HSL顏色是可以互相轉換的。

1. RGB

D3中,RGB顏色的建立、調整明暗、轉換為HSL等方法的說明如下。

  • d3.rgb(r, g, b)

分別輸出r、g、b值來建立顏色,範圍都為[0, 255]。

  • d3.rgb(color)

輸入相應的字串來建立顏色,例如:

(1)RGB的十進位制值:“rgb(255, 255, 255)”

(2)HSL的十進位制值:“hsl(120, 0.5, 0.5)”

(3)RGB的十六進位制值:“#ffeeaa”

(4)RGB的十六進位制值的縮寫形式:“#fea”

(5)顏色名稱:“red”、“white”

  • rgb.brighter([k])

顏色變得更明亮。RGB各通道的值乘以0.7 ^ -k。如果k省略,k的值為1。只有當某通道的值的範圍在30-255之間時,才會進行相應的計算。

  • rgb.darker([k])

顏色變得更暗。RGB各通道的值乘以0.7 ^ k。

  • rgb.hsl()

返回該顏色對應的HSL值。

  • rgb.toString()

以字串形式返回該顏色值,如“#ffeeaa”。

需要注意的是,brighter()和darker()並不會改變當前顏色本身,而是返回一個新的顏色,新的顏色的值發生了相應的變化。請看以下程式碼。

var color1 = d3.rgb(40,80,0);
var color2 = d3.rgb("red");
var color3 = d3.rgb("rgb(0,255,255)");

//將color1的顏色變亮,返回值的顏色為 r: 81, g: 163, b:0
console.log( color1.brighter(2) );
//原顏色值不變,依然是 r: 40, g: 80, b:0
console.log( color1 );

//將color2的顏色變亮,返回值的顏色為 r: 124, g: 0, b:0
console.log( color2.darker(2) );
//原顏色值不變,依然是 r: 255, g: 0, b:0
console.log( color2 );

//輸出color3顏色的HSL值,h: 180, s: 1, l: 0.5
console.log( color3.hsl() );

//輸出#00ffff
console.log( color3.toString() );

函式brighter()、darker()、hsl()返回的都是物件,不是字串,前兩個函式返回的是 RGB 物件,最後一個函式返回的是 HSL 物件。

2. HSL

HSL顏色的建立和使用方法與RGB顏色幾乎是一樣的,只是顏色各通道的值不同而已。

  • d3.hsl(h, s, l):根據h、s、l的值來建立HSL顏色
  • d3.hsl(color):根據字串來建立HSL顏色
  • hsl.brighter([k]):變得更亮
  • hsl.darker([k]):變得更暗
  • hsl.rgb():返回對應的RGB顏色
  • hsl.toString():以RGB字串形式輸出該顏色

對於HSL顏色來說,brighter()和darker()很好理解,即更改該顏色的明度值。請看以下程式碼。

var hsl = d3.hsl(120,1.0,0.5);

//返回的物件中,h:120, s:1.0, l:0.714
console.log( hsl.brighter() );

//返回的物件中,h:120, s:1.0, l:0.35
console.log( hsl.darker() );

//返回的物件中,r:0, g:255, b:0
console.log( hsl.rgb() );

//輸出#00ff00
console.log( hsl.toString() );

一般來說,程式設計人員喜歡使用RGB顏色,比較好理解。美術人員更喜歡使用HSL顏色,方便調整飽和度和亮度。

3. 插值

常常會有這種需求,要得到兩個顏色值之間的值,這種時候就要用到插值(Interpolation)。D3提供了d3.interpolateRgb()來處理RGB顏色之間的插值運算,d3.interpolateHsl()來處理HSL顏色之間的運算。更方便的是使用d3.interpolate(),它會自動判斷呼叫哪一個函式。d3.interpolate()也可以處理數值、字串等之間的插值。請看下面的例子。

var a = d3.rgb(255,0,0);	//紅色
var b = d3.rgb(0,255,0);	//綠色

var compute = d3.interpolate(a,b);

console.log( compute(0) );		//輸出#ff0000
console.log( compute(0.2) );		//輸出#cc3300
console.log( compute(0.5) );		//輸出#808000
console.log( compute(1) );		//輸出#00ff00

console.log( compute(2) );		//輸出#00ff00
console.log( compute(-1) );		//輸出#ff0000

這段程式碼裡,先定義了兩個顏色:紅和綠。然後呼叫d3.interpolate(a, b),會返回一個函式,函式儲存在compute裡。這時候,compute就是一個函式,它接收一個數值,數值為0時,返回紅色,數值為1時,返回綠色。數值為0到1之間的值時,返回位於紅色和綠色之間的顏色。如果輸入值超出1,則返回的是綠色,數值小於0,則返回紅色,這是根據呼叫d3.interpolate(a, b)的時候,傳入引數的順序決定的。

文件資訊

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

相關推薦

D3.js 高階系列5.0 顏色

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

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

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

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

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

D3.js 入門系列 --- 9.6 打包圖的製作

    轉載請註明出處,謝謝。     打包圖( Pack ),用於包含與被包含的關係,也表示各個物件的權重,通常用一圓套一圓來表示前者,用圓的大小來表示後者。     這是各城市所屬關係的資料。我們現在要用 D3 的 layout 來轉換資料,使其容易進行視覺化處理

D3.js 入門系列 --- 10.2 可拖動的地圖

    轉載請註明出處,謝謝。     本節是結合9.2節 和10節 的內容製作的一個可力學導向的中國地圖,使用者可以拖動中國的各個省份。     1. 定義各函式 var projection = d3.geo.mercator() .center(

D3.js 入門系列 — 6 讓圖表動起來

1. 什麼是動態效果 前面幾章製作的圖表是一蹴而就地出現,然後繪製完成後不再發生變化的,這是靜態的圖表。 動態的圖表,是指圖表在某一時間段會發生某種變化,可能是形狀、顏色、位置等,而且使用者是可以看到變化的過程的。 例如,有一個圓,圓心為 (100, 100)。現在我們希

D3.js 入門系列 --- 7 理解 update, enter, exit 的使用

    轉載請註明出處,謝謝。     在前面幾節中反覆出現瞭如下程式碼: svg.selectAll("rect") .data(dataset) .enter() .append("r

D3.js 入門系列 --- 3 做一個簡單的圖表!

    轉載請註明出處,謝謝。     前面說了幾節,都是對文字進行處理,這一節中將用 D3.js 做一個簡單的柱形圖。     做柱形圖有很多種方法,比如用 HTML 的 div 標籤,或用 svg 。     推薦用 SVG 來做各種圖形。SVG 意為可縮放

D3.js 入門系列 --- 1 第一個程式HelloWorld

下面開始用D3.js處理第一個簡單問題,先看下面的程式碼:  <html> <head> <meta charset="utf-8"&g

D3.js 入門系列 --- 9 常見視覺化圖形

    轉載請註明出處,謝謝。     Layout ,直譯為“佈局,安排”。但在 D3 中不是這個意思。     D3 中有很多 Layout 函式,它們不是為了在畫面中佈局什麼,在 D3 中是對輸入的資料進行轉換,轉換成比較容易進行視覺化的資料。實際進行視覺化時,

d3.js實踐教程特別篇PornHub釋出基於d3的網民觀看成人視訊時長分佈互動式地圖

學習d3.js(以下都簡稱d3)也有一段時間了,執行d3做了幾個專案。我發現中文的d3教程很少,國外資料多但要求有一定的英文閱讀能力(推薦網址:http://bl.ocks.org/mbostock),於是就萌發了寫一個d3實際運用系列文章的想法,現在開始付之行動。在系列

D3.js資料視覺化實戰--(2)本地時間軸

背景需求 繪製效果 實現思路 關鍵技術 完整程式碼 背景需求 使用D3繪製圖表一般都會繪製一個座標軸,但是用D3畫過圖的同學都知道預設情況下繪製的座標軸刻度是英文的。但是我們要

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資料視覺化系列教程(三十)--力導向圖之帶文字

(1)連結陣列var links = [ {source: "Microsoft", target: "Amazon", type: "licensing" ,weight:1,color:1}, {source: "Microsoft", target:

D3.js資料視覺化系列教程(十六)--更新、過度和動畫

//(1) 準備資料集 var dataset = [ 5, 10, 13, 19, 21, 25, 22, 18, 15, 13, 11, 12, 15, 20, 18, 17, 16, 18, 23, 25 ]; //(2) 設定SVG的高寬 var w=600; va

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

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

D3.js資料視覺化系列教程(二十二)--互動圖表之提示條

//鍵值對資料集 var dataset = [ {key:0,value:5}, {key:1,value:10}, {key:2,value:13}, {key:3,value:19}, {key:4,value:21}, {key:5,value:25}, {key:6,value:22}, {ke

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

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

D3.js資料視覺化系列教程(二十五)--載入csv檔案

csv檔案由csv資料生成的圓環!  1. 載入csv資料用到d3.csv函式,第一個引數是地址,第二個引數是個回撥函式d3.csv("http://localhost:8080/spring/D3da