ggplot 2.0.0(Hadley Wickhan博文翻譯)

我很高興宣布ggplot2.0.0發布啦,我發誓這個版本不會再被更新。但是當我在編輯第二本關於ggplot2的書時,我沒法阻止自己去解決一些持續了一段時間的問題。

在ggplot2發布的時刻,它已經是一個巨量的有過百的地方被修整和改進的包了。這可能會打破你已有的代碼(儘管我已經試著讓這種破壞儘可能最小化了),但是我希望它的一些新特點少製造一些麻煩。這個博文會有許多重要改變的內容:

? ggplot2現在有正式的延伸機制。

? 有少量新添加的geom和對原有geom的更新。

? 缺失值的出現已經被徹底調整了,所以很多plot會看上去好很多。

?對於刻面標籤現在有更豐富的設置選項

?文檔已經被更新得更加有幫助,而且少數必要得集成包也超越了一些繁複的程輯包。

?許多舊的和很少用的特性已經被撤掉

那些更多細節描述在下面,所有改變可以看這個完整發布的筆記清單:

延伸:Extensibility

可能最大的消息是這個版本的ggplot2現在有正式的延伸機制。這意味著其他人可以很容易地創建他們的統計數字,幾何圖形和位置信息,而且可以把他們做進程輯包中,這可以讓ggplot2社群更閃耀,甚至可以少量地推動ggplot2本身發展。

與此變化一起的,ggplot2不再用典型的或者參考類, 相反,我們現在使用的ggproto,是一個專為ggplot2創造的OO系統。不像proto和RC,ggplot2支持清理過的cross-package 遺產,它是延展性所必須的。創造一個新的OO系統不是通常意義上的對的方法,但是我很確定它在這是必要的。在下面的插圖中會了解更多。

新的和已更新的geoms

假如你的繪製是沒有圖層的錯誤的文件,現在ggplot不再丟棄它,相反,它會為你自動添加圖層板geom_blank():

ggplot(mpg, aes(cyl, hwy))

geom_count() (為舊的stat_sum()添加一些新別名) 這些計數點在散點圖唯一的位置上,而且圖上點的大小可以計算:

?t ggplot(mpg, aes(cty, hwy)) + n?t geom_point()n?t ggplot(mpg, aes(cty, hwy)) +n geom_count()n

geom_curve()以同樣的方式繪製曲線 geom_segment() 繪製直線:

?t df <- expand.grid(x = 1:2, y = 1:2)n? tggplot(df, aes(x, y, xend = x + 0.5, yend = y + 0.5)) +n?t geom_curve(aes(colour = "curve")) +n geom_segment(aes(colour = "segment"))n

?tgeom_bar() 現在的行為不同於 geom_histogram(). 與丟去數據相反的是,它會在每一個唯一的位置上計數觀測值:

?t ggplot(mpg, aes(cyl)) + n?t geom_bar()n?t ggplot(mpg, aes(cyl)) + n geom_histogram(binwidth = 1)n

如果你習慣(壞的)用geom_histogram() 去創造條狀圖, 或者用 geom_bar()去創造柱狀圖, 那麼你需要改過來。

? 圖層在參數方面比之前更嚴格——如果你提供的參數不是美學化的或者參數的,那將會報錯。這會打破一些geoms/stats被將附加參數傳遞到底層的計算。現在geom_smooth()/stat_smooth()和geom_quantile()/stat_quantile() 用method.args 代替;stat_summary(),stat_summary_hex(), and stat_summary2d()用fun.args.這可能會引起一些短期的不適應,但在長期而言它會讓發現拼寫錯誤及其他錯誤變得更容易。

? geom_text()已經被徹底檢修,這會讓你在標記數據的時候容易點。你可以用nudge_x 和nudge_y 參數讓標籤更接近相應的點。check_overlap = TRUE 提供了一個簡單的方法去避免過度繪製標籤:重疊的標籤將被刪除。

ggplot(mtcars, aes(wt, mpg, label = rownames(mtcars))) +n?t geom_point() + n geom_text(nudge_y = 0.5, check_overlap = TRUE)n

(好的標記點仍然是一個巨大的痛處,但是至少新的一些功能讓這變好了那麼一點點。)

?tgeom_label() 工作方式像 geom_text()但是每個標籤都在圓矩形的下面:

?tgrid <- expand.grid(n?t x = seq(-pi, pi, length = 50),n?t y = seq(-pi, pi, length = 50)n?t) %>% mutate(r = x ^ 2 + y ^ 2, z = cos(r ^ 2) * exp(-r / 6))n?tn?tggplot(grid, aes(x, y)) +n?t geom_raster(aes(fill = z)) +n?t geom_label(data = data.frame(x = 0, y = 0), label = "Center") +n?t theme(legend.position = "none") +n coord_fixed()n

?taes_() 代替了 aes_q(), 而且作用像dlpyr包中的SE函數和其他一些我最近發布的包,它提供一些公式,所以aes_(~carat, ~price)比aes(carat, price)在SE version上更簡明。你可能想在程輯包中使用它,因為它將避免對未定義的全局變數進行錯誤的r CMD檢查警告。

?tggplot(mpg, aes_(~displ, ~cty)) + n?t geom_point()n?t# 等同於n?tggplot(mpg, aes(displ, cty)) + n geom_point()n

外觀Appearance

我對一些默認的外觀做了一些微調:

默認的 theme_grey() 背景顏色從「grey90」改成「grey92」:這會讓背景板看上去有一點突出。

? t為了可讀性,標籤和標題都進行了一些微調。刻度標籤顏色更深一些,圖標標題也和刻度標籤一樣。

?t 默認的字體大小從12降到11,你可能會驚訝於已經有很多人認為文本字體很難讀的情況下把字體改小。這種轉變是因為Rstudio(fixed in 0.99.724)中的一個bug,這種縮小是基於繪製圖上的所有文字格的,一旦這個修復了,對我的眼睛而言默認的字體就有點太大了。

?t scale_size()現在繪製在映射值區,沒有半徑。如果你想就有用scale_radius()的舊習慣(不推薦,除非是線),如果你想要0到0的區域,那就繼續用scale_size_area()。

?t 條形和矩形圖例不再有對角線。相反,邊界被調整以使其可見,更接近於繪製在圖上的線條的大小。

?tggplot(mpg, aes(factor(cyl), fill = drv)) + n?t geom_bar(colour = "black", size = 1) + n coord_flip()n

?tgeom_point() 現在用19號代換了以前的16號。在Linux 默認的繪圖系統上這會看起來好一些(這隻比以前舊的點小了那麼一點點,不過它對繪圖不會有什麼太大的影響)現在你可以用stroke 參數來控制外邊線的寬度在21-25之間。

?t 為了讓圖例和屏幕更匹配,現在默認的圖例將分出更多的行(如果是垂直的)或更多的列(如果是水平的)。你可以重寫與nrow / ncol參數guide_legend()

?t p <- ggplot(mpg, aes(displ,hwy, colour = manufacturer)) +n?t geom_point() + n?t theme(legend.position = "bottom")n?t pn?t # Revert back to previous behaviournp + guides(colour = guide_legend(nrow = 1))n

?t 兩個新的theme是由:Jean-Olivier Irisson貢獻的。theme_void()完全是空的,theme_dark()讓的設計讓黑色背景板有顏色更加突出。

刻面標籤Facet labels

感謝Lionel Henry的工作,讓刻面標籤有三大改進:

1. 你可以改變刻面標籤位置讓它們更靠近坐標軸。

2.facet_wrap()現在支持自定義標籤。

3.當facetting 有多個變數時你可以創造標籤組合。

切換標籤:

新的 switch參數允許您讓標籤更接近坐標軸:

data <- transform(mtcars,n am = factor(am, levels = 0:1, c("Automatic", "Manual")),n gear = factor(gear, levels = 3:5, labels = c("Three", "Four", "Five"))n)nnggplot(data, aes(mpg, disp)) +n geom_point() +n facet_grid(am ~ gear, switch = "both")n

當字元直接在軸邊時這個特別有用。在這種情況下,改變標籤可以讓圖更清晰可讀。你可能還想用strip.background to element_blank()來設置中性背景:

data <- mtcars %>% n mutate(n Logarithmic = log(mpg),n Inverse = 1 / mpg,n Cubic = mpg ^ 3,n Original = mpgn) %>% tidyr::gather(transformation, mpg2, Logarithmic:Original)nnggplot(data, aes(mpg2, disp)) +n geom_point() +n facet_wrap(~transformation, scales = "free", switch = "x") +n theme(strip.background = element_blank())n

多重邊緣Composite margins

當你的刻面使用+面對諸多變數時,標籤功能可以更好地支持這種多重邊緣。不管標籤彼此是以一條或者多條線來呈現,所有標籤功能都可以用multi_line 參數來控制。

標籤功能的工作方式都是一樣的,除了label_bquote(),涉及刻面因子值的表達式現在更容易去寫了。從歷史觀點上來說,label_bquote()為所有的邊緣和因子指定一個單一的表達式。因子值是指通過引用佔位符(X)。現在它可以支持多個表達式結合多個變數,不過你必須引用變數自身的名字。額外的,你可以為每一個邊緣提供不同的表達式:

my_labeller <- label_bquote(n rows = .(am) / alpha,n cols = .(vs) ^ .(cyl)n)nnggplot(mtcars, aes(wt, mpg)) +n geom_point() +n facet_grid(am ~ vs + cyl, labeller = my_labeller)n

文檔Documentation

我已經把文檔徹底修改過了:

? t連接geoms和stats的(比如:geom_boxplot() 和stat_boxplot())現在都記錄在同一個文件,你可以在一個地方看到所有的參數。同樣的,theme中的變數(像是 geom_path(), geom_line(), 和 geom_step())也被記錄在一起。

?t 我試著減少用…這樣你就可以在一個地方看到所有的文檔而不用追隨周圍的那些鏈接。在某些情況下,需要額外增加參數給geoms,讓它更清楚你要做什麼。

? t感謝 Bob Rudis, 對qplot()實例的使用已大大減少。這是和ggplot2書第二版的內聯,從而減少了qplot()更贊成使用ggplot()。

過時的特點Deprecated features

? t順序美學功能正式棄用。它從來沒有真正發揮作用,而且記錄不足。

?t qplot()的 stat和位置參數已經過時。qplot()是專為快速繪圖的,如果您需要指定的位置或狀態,請使用ggplot()。

? t設置axis.ticks.margin的主題已經過時:現在使用axis.ticks Margin屬性。

?t stat_abline(), stat_hline() 和stat_vline() 已經被移除:它們從來都不適用除了跟他們相應的geom,並且沒有被記錄。

? ttshow_guide 改名為show.legend:這更精確地反映了它的作用(控制圖例層的呈現), 用法和其他的ggplot2參數遵循一樣的慣例(i.e. a . between names). (是的,我知道這與函數的名字不符(用__)但是現在改太晚了。)

?t 一些geom的名字改得跟它們得功能更相符。 以前得名字在一段時期內還可以用,但是你應該在新的工作中改用新名字。

?t stat_binhex() 和 stat_bin2d() 改名為stat_bin_hex() and stat_bin_2d(). stat_summary2d() 改名為 stat_summary_2d(), geom_density2d()/stat_density2d() 改名為 geom_density_2d()/stat_density_2d().

? t自從我認識到 stat_spoke()是多重化的geom_segment()後,stat_spoke()現在是 geom_spoke()

? tstat_bindot() 已經被移除了,因為它和geom_dotplot()聯繫太緊密了。如果你碰巧要用stat_bindot(), 請改用geom_dotplot().

所有現在沒有的函數都已被刪除。

推薦閱讀:

讀書就是「讀」這麼簡單?實際上,讀書要讀、寫筆記、討論、做以及教別人
同時面臨(編程、英語、網路安全)三個知識塊,該怎麼進行學習?
專心學習,老東想西想的?
一次讀者問答:關於刻意練習、100 小時定律與「過程就是獎勵」

TAG:R编程语言 | 学习方法 |