具體內容**於《資料視覺化之美》的11章的維基百科視覺化
圖1維基百科可以顯示幾組不同版本的差別,突出所增加和刪除的文字,但是我們希望能夠看到一篇文章隨著時間推移的所有編輯的總體概覽。為了達到這個目的,我們引入了一種新的稱為「歷史流」 (history flow)的視覺化技術。
即使我們手中有資料,我們也無法直接開始編寫圖形**。我們需要自己計算出相鄰的文章之間的差別。找出兩篇文章的差異出現的位置以及內容間的具體區別,這看起來像個日常的運作程式,類似於普通使用者使用的應用程式microsoft word以及開發者們使用的類似版本控制軟體這樣的開發者工具。但是這種做也實際上比看起來更靈活一些,雖然(可能也正因為)這個問題已經被人們研究了很長時間,最終發現不存在最佳的方式來實現這個功能。
目前的挑戰在於不存在唯一的某種方式能夠描述文字之間的區別。舉個例子,考慮以下兩個句子:
大多數算也能夠告訴你和第乙個句子相比,在第二個句子中,單詞quick (迅速的)被刪除了,而單詞clay (瓷)是新增的.但是單詞「大」呢?它是否是在乙個地方被插入了而在另乙個地方刪除了,或者只是簡單地從結尾移到開頭?類似地,單詞post (柱子)是否是被刪掉並由單詞pots (壺)代替,或者「post」這個單詞的字母序被重新組合成了「 pots」?
不同的解釋在邏輯上都是一致的,因此目標是選擇乙個在特定上下文中有意義的演算法。對我們而言,我們認為編輯可能改變一塊文字位置——把乙個單詞或乙個句子從文字的乙個地方移動到另乙個地方——但是不太可能通過改變字母位置來改變個別單詞。因此,我們選擇paulheckel提出的演算法,雖然該演算法能把單詞作為原子單元進行處理,它使我們能夠追蹤大段落的位置變換。該演算法的輸出是兩個序列之間的一組對應,其形式是「檔案a中的第5個單詞和檔案b中的第127個單詞對應。」
heckel的演算法實現很簡單,我們很快就一切準備就緒並開始分析。對於每一篇文章,我們有每個版本的文字,還有不同版本之間的「對應」關係.但是應該如何對不同版本進行展示?首先,因為這是基於時間的資料,使用x軸表示次序是有意義的,把第乙個版本放在左邊,第二個版本放在右邊等。這種方式適用於檢視一篇文章的編輯歷史,因為文件中每個位置都像一條「河流」上的不同「湍流」。剛開始,x軸只是表示序列化資訊,每個版本是乙個座標點,不同座標點之間的畫素數相同,然後我們加入乙個根據編輯時間的設定版本間距離的選項,因此間隔很短的版本之間在空間距離上也很緊密。這兩種檢視資料的方式後來都被證明是很有用的。
接下來,我們需要對文件位置和段落之間的對應關係進行編碼。我們決定使用豎線描繪版本,其長度與每個版本的長度相對應。實際上,y軸對每個版本內部的文件位置進行編碼。一且我們做出這個決定,就很容易知道應該如何在乙個版本到另乙個版本間畫線來描述匹配關係了,如圖2所示(它是我們在開始編碼前在白板上手工描繪的乙個素描)。
實現**:(參考了lscj**的某位學霸的)
opar
# 讀資料檔案
a men
total
# 畫布要素全域性設定
par(lwd=5,bg="#3d3d3dff")
col1
cst
palette(col1)
debug0
# 根據版本內容設定座標系的大小
h w
plot(0,0, type="n", col=1, xlim=c(-0.5, w+0.3), ylim=c(0,h+1))
# 對第一次版本處理
a2 x
y lines(x,y, col= which(men == a2[[1]][1]))
text(1, h+1 ,paste("version",1),col="white")
# 開始繪圖
for(i in
2:w)else
hy2 }j
}}# 輸出版本發布人姓名
要想從上圖變到下圖,將**中debug0 改為debug0 即可。
第三週作業
實驗作業 1.輸入課本各個例題,除錯執行程式,並分析程式,將每乙個程式改寫2到3個版本,自己分析程式結果,然後再除錯執行,核對分析結果的對錯。2.編寫程式輸入乙個三角形的三條邊,計算其面積和周長 3.編寫程式計算並輸出課本本章習題3表示式的值並分析結果。4.編寫乙個程式,輸入乙個一元二次方程的三個係...
第三週作業
要求 1.輸入課本各個例題,除錯執行程式,並分析程式,將每乙個程式改寫2到3個版本,自己分析程式結果,然後再除錯執行,核對分析結果的對錯。2.編寫程式輸入乙個三角形的三條邊,計算其面積和周長 3.編寫程式計算並輸出課本本章習題3表示式的值並分析結果。4.編寫乙個程式,輸入乙個一元二次方程的三個係數,...
第三週作業
第一題 輸入課本各個例題,除錯執行程式,並分析程式。例1 include using namespace std int main 例8 includeusing namespace std int main else cout this is not a endl return 0 第三題 編寫程...