美文网首页R语言做生信
【R|pyhon|Distribution|可视化】Violin

【R|pyhon|Distribution|可视化】Violin

作者: 郑宝童 | 来源:发表于2018-11-15 10:59 被阅读17次

主要参考资料:https://www.data-to-viz.com/graph/violin.html
小提琴图(Violin plots)可以可视化一个或几个组的数字变量的分布。它和箱形图boxplot相似,但它能让我们对密度有更深入的了解。小提琴特别适用于数据量巨大且无法显示单个观察结果的情况。Seaborn 尤其适合通过其小提琴函数来实现它们。violinplot是一种非常方便的显示数据的方式,与boxplot相比,它可能更值得关注,因为后者有时会隐藏数据的特性。
每个“小提琴”代表一个组或一个变量。形状表示变量的密度估计:特定范围内的数据点越多,该范围内的小提琴就越大。
参考自data-to-viz-violin

这里有一个例子展示了人们如何看待概率(how people perceive probability
。在reddit的 /r/samplesize
帖子中,有人问了一些问题,比如你认为“Highly likely”这个词的概率是多少。记录在0到100之间的答案,下面是每个问题的分布:
示例数据大概长这样:

data
# Libraries
library(tidyverse)
library(hrbrthemes)
library(viridis)

# Load dataset from github
data <- read.table("https://raw.githubusercontent.com/zonination/perceptions/master/probly.csv", header=TRUE, sep=",")
data <- data %>% 
  gather(key="text", value="value") %>%
  mutate(text = gsub("\\.", " ",text)) %>%
  mutate(value = round(as.numeric(value),0)) %>%
  filter(text %in% c("Almost Certainly","Very Good Chance","We Believe","Likely","About Even", "Little Chance", "Chances Are Slight", "Almost No Chance"))

#%>%把前方的内容作为后方函数的第一个参数
#gather 构建键值对(tidyverse包)
#mutate 这个函数与transform非常相似,但是它迭代地执行转换,以便以后的转换可以使用以前转换创建的列。与转换一样,未命名的组件也会自动删除。
#filter 过滤

# Plot
data %>%
  mutate(text = fct_reorder(text, value)) %>%
  ggplot( aes(x=text, y=value, fill=text, color=text)) +
    geom_violin(width=2.1, size=0.2) +
    scale_fill_viridis(discrete=TRUE) +
    scale_color_viridis(discrete=TRUE) +
    theme_ipsum() +
    theme(
      legend.position="none"
    ) +
    coord_flip() +
    xlab("") +
    ylab("Assigned Probability (%)")
#fct_reorder factor化
image.png

提琴图是一种强大的数据可视化技术,因为它允许比较多个组的排名和它们的分布。令人惊讶的是,它比boxplot用得少,即使在我看来它提供了更多的信息。

小提琴特别适用于大量的数据,。对于小数据集,带有箱线图可能是更好的选择,因为它确实显示了所有信息。
小提琴的曲线图大部分时间是垂直制作的。如果您有较长的标签,那么构建一个类似于上面的水平版本将使标签更具可读性。可以在小提琴中显示箱形图:它允许对中位数和四分位数进行粗略评估。

# create a dataset
data <- data.frame(
  name=c( rep("A",500), rep("B",500), rep("B",500), rep("C",20), rep('D', 100)  ),
  value=c( rnorm(500, 10, 5), rnorm(500, 13, 1), rnorm(500, 18, 1), rnorm(20, 25, 4), rnorm(100, 12, 1) )
)

# sample size
sample_size = data %>% group_by(name) %>% summarize(num=n())

# Plot
data %>%
  left_join(sample_size) %>%
  mutate(myaxis = paste0(name, "\n", "n=", num)) %>%
  ggplot( aes(x=myaxis, y=value, fill=name)) +
    geom_violin(width=1.4) +
    geom_boxplot(width=0.1, color="grey", alpha=0.2) +
    scale_fill_viridis(discrete = TRUE) +
    theme_ipsum() +
    theme(
      legend.position="none",
      plot.title = element_text(size=11)
    ) +
    ggtitle("A Violin wrapping a boxplot") +
    xlab("")
image.png

如果对变量进行分组,就可以像对boxplot那样构建一个分组小提琴。这里有一个例子,显示了每天男性和女性的小费数量。


image.png

只要你的样本量足够大,小提琴图通常是替代箱线图一个很好方案。但如果你有很多组,小提琴图可能不是最好的选择,因为每把小提琴都是非常薄的,这使得很难形象化分布。在这种情况下,一个很好的替代方案是山脊线图(后续文章会提到山脊图)( ridgeline plot

data %>%
  mutate(text = fct_reorder(text, value)) %>%
  ggplot( aes(x=text, y=value, fill=text, color=text)) +
    geom_violin(width=2.1, size=0.2) +
    scale_fill_viridis(discrete=TRUE) +
    scale_color_viridis(discrete=TRUE) +
    theme_ipsum() +
    theme(
      legend.position="none"
    ) +
    coord_flip() +
    xlab("") +
    ylab("Assigned Probability (%)")
image.png
# Load dataset from github
data <- read.table("https://raw.githubusercontent.com/zonination/perceptions/master/probly.csv", header=TRUE, sep=",")
data <- data %>% 
  gather(key="text", value="value") %>%
  mutate(text = gsub("\\.", " ",text)) %>%
  mutate(value = round(as.numeric(value),0)) %>%
  filter(text %in% c("Almost Certainly","Very Good Chance","We Believe","Likely","About Even", "Little Chance", "Chances Are Slight", "Almost No Chance"))

library(ggridges)

data %>%
  mutate(text = fct_reorder(text, value)) %>%
  ggplot( aes(y=text, x=value,  fill=text)) +
    geom_density_ridges(alpha=0.6, bandwidth=4) +
    scale_fill_viridis(discrete=TRUE) +
    scale_color_viridis(discrete=TRUE) +
    theme_ipsum() +
    theme(
      legend.position="none",
      panel.spacing = unit(0.1, "lines"),
      strip.text.x = element_text(size = 8)
    ) +
    xlab("") +
    ylab("Assigned Probability (%)")
image.png

更多的小提琴图Rcode 和python code 请访问:
R violin-plot
python violin-plot

R violin-plot python violin-plot

简书上还有一些关于小提琴图的文章:比如
R学习 - 箱线图 小提琴图

相关文章

网友评论

    本文标题:【R|pyhon|Distribution|可视化】Violin

    本文链接:https://www.haomeiwen.com/subject/cduefqtx.html