R 使用ggplot2,可以在轴中插入打断吗?
我想做一个条形图,其中一个值比所有其他值都大。有没有办法使y轴不连续?我的数据如下:R 使用ggplot2,可以在轴中插入打断吗?,r,ggplot2,r-faq,R,Ggplot2,R Faq,我想做一个条形图,其中一个值比所有其他值都大。有没有办法使y轴不连续?我的数据如下: df <- data.frame(a = c(1,2,3,500), b = c('a1', 'a2','a3', 'a4')) p <- ggplot(data = df, aes(x = b, y = a)) + geom_bar() p <- p + opts(axis.text.x=theme_text(angle= 90, hjust=1)) + coord_flip() p
df <- data.frame(a = c(1,2,3,500), b = c('a1', 'a2','a3', 'a4'))
p <- ggplot(data = df, aes(x = b, y = a)) + geom_bar()
p <- p + opts(axis.text.x=theme_text(angle= 90, hjust=1)) + coord_flip()
p
不,不使用ggplot。参见线程中的讨论,Hadley解释了为什么不可能,但给出了一个建议的替代方案(分面图,一个包含所有数据,一个在特定区域缩放)。否,不使用ggplot。参见线程中的讨论,Hadley解释了为什么不可能,但给出了一个建议的替代方案(分面图,一个包含所有数据,一个在特定区域缩放)。如其他地方所述,
ggplot2
无法很好地处理这一问题,因为断轴通常被认为是有问题的
其他策略通常被认为是解决这个问题的更好方法。Brian提到了一些(刻面,两个关注不同值集的情节)。人们经常忽略的另一个选择,尤其是柱状图,是制作一张表格:
从实际值来看,500并没有掩盖其他值之间的差异!由于某些原因,表作为一种可视化技术并没有得到足够的重视。您可能会反对您的数据有很多类别,这些类别在表中变得很难处理。如果是这样的话,你的条形图很可能也会有太多的条形图
我不是一直在为桌子争论。但如果你用相对少的酒吧制作条形码,这绝对是一件值得考虑的事情。如果你正在用大量的条形图制作条形图,你可能需要重新考虑一下
最后,在实现断轴的
plotrix
包中还有axis.break
函数。但是,根据我收集的信息,您必须亲自指定轴标签和位置。如其他地方所述,这不是ggplot2
能够很好处理的事情,因为断轴通常被认为是有问题的
其他策略通常被认为是解决这个问题的更好方法。Brian提到了一些(刻面,两个关注不同值集的情节)。人们经常忽略的另一个选择,尤其是柱状图,是制作一张表格:
从实际值来看,500并没有掩盖其他值之间的差异!由于某些原因,表作为一种可视化技术并没有得到足够的重视。您可能会反对您的数据有很多类别,这些类别在表中变得很难处理。如果是这样的话,你的条形图很可能也会有太多的条形图
我不是一直在为桌子争论。但如果你用相对少的酒吧制作条形码,这绝对是一件值得考虑的事情。如果你正在用大量的条形图制作条形图,你可能需要重新考虑一下
最后,在实现断轴的
plotrix
包中还有axis.break
函数。但是,根据我收集的信息,您必须亲自指定轴标签和位置。我怀疑R中是否有现成的内容,但您可以将数据显示为一系列3D部分立方体。500只有5*10*10,所以它可以很好地扩展。确切的值可以是一个标签
这可能只有在出于某种原因必须使用图形表示的情况下才应该使用。我怀疑R中是否有现成的内容,但您可以将数据显示为一系列3D部分立方体。500只有5*10*10,所以它可以很好地扩展。确切的值可以是一个标签
仅当出于某种原因必须使用图形表示时,才应使用此选项。不使用ggplot,但使用plotrix,您可以轻松地执行此操作:
library(plotrix)
gap.barplot(df$a, gap=c(5,495),horiz=T)
不是使用ggplot,而是使用plotrix,您可以轻松做到这一点:
library(plotrix)
gap.barplot(df$a, gap=c(5,495),horiz=T)
没有,不幸的是没有 令人担心的是,允许不连续的轴会导致观众的欺骗。然而,在某些情况下,没有不连续轴会导致变形 例如,如果轴被截断,但通常位于某个间隔内(例如[0,1]),受众可能不会注意到截断,并对数据做出扭曲的结论。在这种情况下,显式不连续轴更合适、更透明 比较:
不,不幸的是没有 令人担心的是,允许不连续的轴会导致观众的欺骗。然而,在某些情况下,没有不连续轴会导致变形 例如,如果轴被截断,但通常位于某个间隔内(例如[0,1]),受众可能不会注意到截断,并对数据做出扭曲的结论。在这种情况下,显式不连续轴更合适、更透明 比较:
一种策略是将轴更改为绘图对数比例。通过这种方式,您可以将指数级较高的值减少10倍。一种策略是将轴更改为绘图对数比例。通过这种方式,您可以在八年后将指数级更高的值减少10倍,
ggforce
包提供了一个facet_zoom()
扩展,它是用于显示两个图(如中所述)的实现
缩放面
不幸的是,ggforce
的当前版本0.2.2在coord_flip()
中抛出了一个错误,因此只能显示垂直条
缩放的方面显示了小值的变化,但仍然包含大的-现在被裁剪的-a4
条。zoom.data
参数控制哪些值出现在缩放的面中:
library(ggforce)
ggplot(df) +
aes(x = b, y = a) +
geom_col() +
facet_zoom(ylim = c(0, 10), zoom.data = ifelse(a <= 10, NA, FALSE))
或
两个方面
这是由布莱恩·迪格斯提出的,也是由他解释哈德利建议使用的
分面绘图,一个包含所有数据,一个在特定区域缩放
但没有为该appr提供任何代码
library(ggforce)
ggplot(df) +
aes(x = b, y = a) +
geom_col() +
facet_zoom(ylim = c(0, 10), zoom.data = ifelse(a <= 10, NA, FALSE))
library(ggplot2)
g1 <- ggplot(df) +
aes(x = b, y = a) +
geom_col() +
coord_flip()
g2 <- ggplot(df) +
aes(x = b, y = a) +
geom_col() +
coord_flip() +
ylim(NA, 10)
cowplot::plot_grid(g1, g2) # or ggpubr::ggarrange(g1, g2)
gridExtra::grid.arrange(g1, g2) # or egg::ggarrange(g1, g2)
library(dplyr)
library(ggplot2)
ggplot() +
aes(x = b, y = a) +
geom_col(data = df %>% mutate(subset = "all")) +
geom_col(data = df %>% filter(a <= 10) %>% mutate(subset = "small")) +
coord_flip() +
facet_wrap(~ subset, scales = "free_x")
library("tidyverse")
df <- data.frame(myLetter=LETTERS[1:4], myValue=runif(12) + rep(c(4,0,0),2)) # cluster a few values well above 1
df$myFacet <- df$myValue > 3
(ggplot(df, aes(y=myLetter, x=myValue))
+ geom_point()
+ facet_grid(. ~ myFacet, scales="free", space="free")
+ scale_x_continuous(breaks = seq(0, 5, .25)) # this gives both facets equal interval spacing.
+ theme(strip.text.x = element_blank()) # get rid of the facet labels
)