用Tableau畫(huà)一幅世界名畫(huà)

幾天前偶然發(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à)。

網(wǎng)絡(luò)圖片

獲取數(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ù)萍膛。


導(dǎo)出數(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ù)


    數(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)注一下

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末剪勿,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子方庭,更是在濱河造成了極大的恐慌厕吉,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件械念,死亡現(xiàn)場(chǎng)離奇詭異头朱,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)龄减,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)项钮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事寄纵”罘螅” “怎么了脖苏?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,435評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵程拭,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我棍潘,道長(zhǎng)恃鞋,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,509評(píng)論 1 284
  • 正文 為了忘掉前任亦歉,我火速辦了婚禮恤浪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘肴楷。我一直安慰自己水由,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布赛蔫。 她就那樣靜靜地躺著砂客,像睡著了一般。 火紅的嫁衣襯著肌膚如雪呵恢。 梳的紋絲不亂的頭發(fā)上鞠值,一...
    開(kāi)封第一講書(shū)人閱讀 49,837評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音渗钉,去河邊找鬼彤恶。 笑死,一個(gè)胖子當(dāng)著我的面吹牛鳄橘,可吹牛的內(nèi)容都是我干的声离。 我是一名探鬼主播,決...
    沈念sama閱讀 38,987評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼瘫怜,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼术徊!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起宝磨,我...
    開(kāi)封第一講書(shū)人閱讀 37,730評(píng)論 0 267
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤弧关,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后唤锉,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體世囊,經(jīng)...
    沈念sama閱讀 44,194評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評(píng)論 2 327
  • 正文 我和宋清朗相戀三年窿祥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了株憾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,664評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖嗤瞎,靈堂內(nèi)的尸體忽然破棺而出墙歪,到底是詐尸還是另有隱情,我是刑警寧澤贝奇,帶...
    沈念sama閱讀 34,334評(píng)論 4 330
  • 正文 年R本政府宣布虹菲,位于F島的核電站,受9級(jí)特大地震影響掉瞳,放射性物質(zhì)發(fā)生泄漏毕源。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評(píng)論 3 313
  • 文/蒙蒙 一陕习、第九天 我趴在偏房一處隱蔽的房頂上張望霎褐。 院中可真熱鬧,春花似錦该镣、人聲如沸冻璃。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,764評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)省艳。三九已至,卻和暖如春塌忽,著一層夾襖步出監(jiān)牢的瞬間拍埠,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,997評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工土居, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留枣购,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,389評(píng)論 2 360
  • 正文 我出身青樓擦耀,卻偏偏與公主長(zhǎng)得像棉圈,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子眷蜓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評(píng)論 2 349