幾天前偶然發(fā)現(xiàn)Adam E McCann大神的tableau public上有一個(gè)作品居然用tableau畫(huà)出了梵高的《星夜》寞焙,頗為震驚,沒(méi)想到還有這種操作级历,所以就暗下決心去研究一下释移,經(jīng)過(guò)幾天的研究,終于自己也嘗試成功了寥殖,并進(jìn)行了一些簡(jiǎn)化玩讳。
Tableau public地址:https://public.tableau.com/profile/adam.e.mccann#!/vizhome/Data17JediChartsPresentationPart1/ArtFinal
首先這個(gè)作品原理很簡(jiǎn)單,就是獲取了每個(gè)像素點(diǎn)的坐標(biāo)和顏色扛禽,然后填充上锋边,但是困難的并不是技術(shù),而是下面兩點(diǎn):
- 如何獲取每個(gè)像素的顏色值
- 如何自動(dòng)填充顏色
下面就進(jìn)入分享階段编曼,我這次試圖用tableau畫(huà)下面這幅彩鉛畫(huà)。
獲取數(shù)據(jù)
獲取數(shù)據(jù)還是使用python剩辟,這次用到的是PIL庫(kù)
from PIL import Image
#RGB轉(zhuǎn)Hex函數(shù)
def RGB_to_Hex(rgb):
strs = '#'
for i in rgb:
num = int(i)
strs += str(hex(num))[-2:].replace('x','0').upper()
return strs
im = Image.open('d:\\彩鉛.jpg')
width = im.size[0]
height = im.size[1]
RGB=[]
#獲取每個(gè)像素的RGB值和hex值
for x in range(width):
for y in range(height):
r, g, b = im.getpixel((x,y))
rgb = im.getpixel((x,y))
_hex=RGB_to_Hex(rgb)
getpixel=[x,y,r,g,b,_hex]
RGB.append(getpixel)
這樣我們就獲得了掐场,所有像素的坐標(biāo)和顏色往扔,下面導(dǎo)出數(shù)據(jù)
import pandas as pd
df=pd.DataFrame(RGB,columns=['X','Y','R','G','B','hex'])
df.to_excel('d:\\rgb.xlsx')
這樣我們就得到了最基本的數(shù)據(jù),因?yàn)閳D片像素是422*437像素熊户,所以一共是184414行數(shù)據(jù)萍膛。
下面就要進(jìn)行整理,其實(shí)R嚷堡、G蝗罗、B三個(gè)字段沒(méi)有什么意義,最重要的就是hex字段蝌戒,因?yàn)橐鶕?jù)hex字段的值來(lái)自定義調(diào)色板串塑。
下面就要新建一個(gè)表,復(fù)制出hex字段北苟,去除重復(fù)值桩匪,并給每個(gè)hex值一個(gè)唯一編號(hào)。整理完后一共是51728個(gè)顏色值友鼻。
這個(gè)唯一編號(hào)與后面要自定義的調(diào)色板是一一對(duì)應(yīng)的
然后把兩張表合并成一張表(vlookup即可)傻昙,rgbcolor就是上面的唯一編號(hào)
自此基本數(shù)據(jù)就整理完畢了。
自定義調(diào)色板
官網(wǎng)教程:https://onlinehelp.tableau.com/current/pro/desktop/zh-cn/formatting_create_custom_colors.htm
三種自定義調(diào)色板彩扔,大家自己研究妆档,我們這次要用的是“創(chuàng)建自定義連續(xù)調(diào)色板”。
把剛才的51728個(gè)顏色值整理成虫碉,官方要求的格式贾惦,用<color>和</color>包裹起來(lái),順序一定不要亂蔗衡,保持原來(lái)的順序纤虽。
然后用記事本打開(kāi)Preferences.tps文件,在<workbook>和</workbook>之間插入整理好的顏色值绞惦,并保存逼纸。
<preferences>
<color-palette name="My Sequential Palette" type="ordered-sequential" >
<color>#00030E</color>
<color>#000511</color>
<color>#000710</color>
<color>#000813</color>
……此處省略幾萬(wàn)行
<color>#FFE7E6</color>
<color>#FFE7E8</color>
<color>#FFEAE5</color>
<color>#FFEDE9</color>
</color-palette>
</preferences>
這樣按順序整理后,第一值#00030E就對(duì)應(yīng)調(diào)色板的0值济蝉,以此類推杰刽。
開(kāi)始作畫(huà)
-
用tableau引入數(shù)據(jù)
- 把[X]拖到列功能區(qū),[Y]拖到行功能區(qū)王滤,在分析中取消“聚合度量”
- 編輯[Y]軸贺嫂,選擇“倒序”
-
把[rgbcolor]拖到顏色標(biāo)簽,這時(shí)候你可能會(huì)看到如下的圖雁乡,這說(shuō)明曙光就在眼前第喳。
因?yàn)橄到y(tǒng)默認(rèn)了用藍(lán)色發(fā)散的顏色,所以每個(gè)點(diǎn)的顏色也就自動(dòng)匹配到了不同的藍(lán)色踱稍,但是也能看到輪廓了曲饱。
-
編輯顏色悠抹,選擇剛才創(chuàng)建的My Sequential Palette,點(diǎn)擊確定扩淀。
注意這里0-51727(51728個(gè)顏色值)楔敌,每個(gè)值都與剛才建立的自定義調(diào)色板上的順序一一對(duì)應(yīng)。這就是自動(dòng)匹配顏色的奧秘所在驻谆。
- 大功告成
在這個(gè)作品的研究中卵凑,自己收獲頗多,以前知識(shí)的盲區(qū)胜臊,也順便補(bǔ)足了勺卢,這就是學(xué)習(xí)的魅力所在。其實(shí)区端,對(duì)于tableau每個(gè)知識(shí)點(diǎn)的研究值漫,只有不斷的挑戰(zhàn)極限,才能真正研究的透徹织盼。要不畏困難杨何,堅(jiān)信自己。
成品的Tableau public地址:https://public.tableau.com/profile/jiangbin#!/vizhome/Drawingwatercolor/1_1
補(bǔ)充:
鑒于數(shù)據(jù)量比較大沥邻,excel運(yùn)行緩慢危虱,晚上又整理了一下代碼,自動(dòng)生成所需要的數(shù)據(jù)唐全,然后只需復(fù)制顏色值表格里的preferences字段到Preferences.tps文件即可埃跷,省去了自己整理數(shù)據(jù)的麻煩。
from PIL import Image
import pandas as pd
import numpy as np
#RGB轉(zhuǎn)Hex函數(shù)
def RGB_to_Hex(rgb):
strs = '#'
for i in rgb:
num = int(i)#將str轉(zhuǎn)int
#將R邮利、G弥雹、B分別轉(zhuǎn)化為16進(jìn)制拼接轉(zhuǎn)換并大寫(xiě)
strs += str(hex(num))[-2:].replace('x','0').upper()
return strs
im = Image.open('d:\\彩鉛.jpg')
width = im.size[0]
height = im.size[1]
print(width,height)
#獲取每個(gè)像素的RGB值和hex值
RGB=[]
for x in range(width):
for y in range(height):
r, g, b = im.getpixel((x,y))
rgb = im.getpixel((x,y))
_hex=RGB_to_Hex(rgb)
getpixel=[x,y,r,g,b,_hex]
RGB.append(getpixel)
#利用pandas整理數(shù)據(jù)表
df=pd.DataFrame(RGB,columns=['X','Y','R','G','B','hex'])
#新建、編輯顏色值表
df2=pd.DataFrame(df['hex'].drop_duplicates(),columns=['hex'])#去掉重復(fù)值
df2.sort_values(by=['hex'],inplace=True)#排序
df2['hex_index']= np.arange(0,df2.shape[0],1)#用等差數(shù)列標(biāo)記顏色唯一值
#輸出坐標(biāo)系表
pd.merge(df,df2).to_csv('d:\\坐標(biāo)系.csv')
#preferences文件格式轉(zhuǎn)換
df2['preferences']=df2['hex'].map(lambda x:'<color>'+str(x)+'</color>')
#輸出顏色值表
df2.to_csv('d:\\顏色值.csv')
此篇文章已發(fā)布到我的公眾號(hào):saodisir延届,有興趣也可關(guān)注一下