Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 使用ggplot2,可以在轴中插入打断吗?_R_Ggplot2_R Faq - Fatal编程技术网

R 使用ggplot2,可以在轴中插入打断吗?

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

我想做一个条形图,其中一个值比所有其他值都大。有没有办法使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

不,不使用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
)