2

我有一个包含两组的条形图,其中 y 轴 = 赚取的美元 & x 轴的宽度 = # 售出单位。下面的示例数据:

test<- structure(list(Person = c("Bob", "Bob", "Bob", "Bob", "Bob", 
"Jim", "Jim", "Jim", "Jim", "Jim"), Car = c("Wombat", "Beetle", 
"Impala", "Carrera", "Sienna", "Wombat", "Beetle", "Impala", 
"Carrera", "Sienna"), tot = c(75090, 229994, 1229347, 247052, 
1148873, 41114, 2430, 430423, 629812, 30442), freq = c(5L, 620L, 
1324L, 219L, 550L, 36L, 1L, 213L, 195L, 2L)), .Names = c("Person", 
"Car", "tot", "freq"), row.names = c(NA, 10L), class = "data.frame")

# Print bar chart.
ggplot()+
geom_bar(data=test,aes(x=reorder(Car,tot,function(x) -sum(x)),
                       y=as.numeric(tot)/1000,width=freq/1000,fill=Person),
       stat='identity',position='identity')

我想对这张图表做以下两件事,但遇到了障碍:

A)对于每个 Car 类别,我希望 Persons 彼此相邻排列,而不是彼此重叠。ggplot 说我不能position = 'dodge'为不同长度的宽度。

B)似乎Car类别之间的间距是根据宽度最大的条设置的。是否可以使该间距以诸如 的方式变化width * .05?例如,我想要Sienna, Carrera, &之间的空间更窄Beetle

4

1 回答 1

1

拆分这些图表可能是一个更好的主意。首先,你所有的问题都会自己解决。其次,您不会在同一轴上混合不同的变量(在您的示例中为销售单位和汽车类别),从而避免不良做法。

如果您坚持按自己的方式绘制事物,那么,我想不出任何快速的方法:ggplot 不鼓励其“非常规”的使用。这是最有名的例子:用 2 个 y 轴绘图,左边一个 y 轴,右边另一个 y 轴

library(gridExtra)
p1 <- ggplot()+
    geom_bar(data=test,aes(x=reorder(Car,tot,function(x) -sum(x)),
                           y=tot/1000,fill=Person),
             stat='identity',position='dodge')
p2 <- ggplot()+
    geom_bar(data=test,aes(x=reorder(Car,tot,function(x) -sum(x)),
                           y=freq/1000,fill=Person),
             stat='identity',position='dodge')
grid.arrange(p1, p2)

在此处输入图像描述

于 2013-12-25T13:47:46.267 回答