自定义气泡图
Customised Bubble plot
我正在尝试绘制气泡图。我的数据是:
Year<-rep(2001:2005, each = 5)
name<-c("John","Ellen","Mark","Randy","Luisa")
Name<-c(rep(name,5))
Value<-sample(seq(0,25,by=1),25)
mydata<-data.frame(Year,Name,Value)
到目前为止,我已经到了这一点:
ggplot(mydata, aes(x=Year, y=Name, size = Value)) +
geom_point() +
theme(axis.line = element_blank(),
axis.text.x=element_text(size=11,margin=margin(b=10),colour="black"),
axis.text.y=element_text(size=13,margin=margin(l=10),colour="black",
face="italic"),
axis.ticks = element_blank(),
axis.title=element_text(size=18,face="bold"),
panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank(),
legend.text = element_text(size=14),
legend.title = element_text(size=18))
我需要做很多修改,但我不明白该怎么做(我对 ggplot2 不是很熟悉)。
首先,我想使用 viridis
比例,但 scale_color_viridis
和 scale_fill_viridis
都不起作用(我也尝试设置 discrete=T
参数)。
其次,我想避免绘制 0 值(即,在绘制 0 值的地方有一个空白 space),但既不使用 na.omit
(例如 ggplot(na.omit(mydata), aes(x=Year, y=Name, size = Value))
或 ggplot(mydata, aes(x=Year, y=Name, size = na.omit(Value)))
) 或从 Value
对象工作中删除 0。
第三,我希望图例是一个连续的比例:Value
的标绘值在 1 到 25 的范围内(因为我想删除零)但默认图例是离散的,有 5 点中断。
我希望情节看起来或多或少像这样(气泡大小取决于 Value
的值):
有什么建议吗?很抱歉有很多问题,但我在理解 ggplot 的工作原理方面遇到了一些真正的困难。谢谢!
这是你要找的吗?
library(ggplot2)
Year<-rep(2001:2005, each = 5)
name<-c("John","Ellen","Mark","Randy","Luisa")
Name<-c(rep(name,5))
Value<-sample(seq(0,25,by=1),25)
Value <- ifelse(Value == 0, NA, Value)
mydata<-data.frame(Year,Name,Value)
ggplot(mydata, aes(x=Year, y=Name, size = Value, colour = Value)) +
geom_point() +
scale_colour_viridis_c() +
scale_size(guide = F) +
theme(axis.line = element_blank(),
axis.text.x=element_text(size=11,margin=margin(b=10),colour="black"),
axis.text.y=element_text(size=13,margin=margin(l=10),colour="black",
face="italic"),
axis.ticks = element_blank(),
axis.title=element_text(size=18,face="bold"),
panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank(),
legend.text = element_text(size=14),
legend.title = element_text(size=18))
#> Warning: Removed 1 rows containing missing values (geom_point).
关于你的观点:
据我所知,我确实只看到了 scale_colour_viridis_c
和 scale_colour_viridis_b
函数,它们在颜色上有所不同。也许我少了一些包裹?
其次,关于 NA
s:您只需将 0 替换为 NA
s。
最后关于色阶:色阶是自动连续的。连续描述大小有点棘手,因此它总是离散的。但是我为您将其从图例中删除,以便您只有示例中的颜色。
为了将数据中的变量映射到某种比例,您使用 aes()
函数将 ggplot2 调用的 'aesthetic' 耦合到表达式(通常是您的列的符号数据)。因此,要制作色标,您必须在 aes()
函数中指定 colour
美学。在下面的代码中,我还指定了一个 alpha
美学,如果 Value > 0
则为 1,否则为 0,使 0 值点完全透明。我指定 I()
让 ggplot2 知道它应该按字面意思取这个值而不是将它映射到一个比例尺。
library(ggplot2)
#> Warning: package 'ggplot2' was built under R version 4.0.3
Year<-rep(2001:2005, each = 5)
name<-c("John","Ellen","Mark","Randy","Luisa")
Name<-c(rep(name,5))
Value<-sample(seq(0,25,by=1),25)
mydata<-data.frame(Year,Name,Value)
g <- ggplot(mydata, aes(x=Year, y=Name, size = Value)) +
geom_point(aes(colour = Value,
alpha = I(as.numeric(Value > 0))))
一旦我们指定了美学,我们就可以开始自定义比例了。典型的模式是 scale_{the aesthetic}_{type of scale}
,所以如果我们想将颜色值映射到绿色尺度(*_c
用于连续尺度),我们需要添加 scale_colour_viridis_c()
。在比例尺中,我们可以指定例如限制,您已经指出它应该在 1 到 25 之间。另外,我添加了一个 scale_size_area()
,我们说我们不想要点的大小的图例通过设置 `guide = "none".
g + scale_colour_viridis_c(option = "C", direction = -1,
limits = c(1, 25)) +
scale_size_area(guide = "none") +
theme(axis.line = element_blank(),
axis.text.x=element_text(size=11,margin=margin(b=10),colour="black"),
axis.text.y=element_text(size=13,margin=margin(l=10),colour="black",
face="italic"),
axis.ticks = element_blank(),
axis.title=element_text(size=18,face="bold"),
panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank(),
legend.text = element_text(size=14),
legend.title = element_text(size=18))
由 reprex package (v1.0.0)
于 2021-02-24 创建
作为思考这个问题的另一种方式...也许它会有所帮助。 :-)
library(tidyverse)
set.seed(123)
df <- tibble(
year = rep(2001:2005, each = 5),
name = rep(c("John","Ellen","Mark","Randy","Luisa"),5),
value = sample(seq(0,25,by=1),25)
)
df %>%
mutate(name_2 = ifelse(year>2001 & year<2005, NA, name)) %>%
ggplot(aes(year, value, group = name, label = name_2, color = name)) +
geom_line() +
geom_point() +
geom_text(vjust = -1) +
scale_color_brewer(palette = "Set1") +
theme_minimal(base_family = "serif") +
theme(legend.position = "none") +
xlab("")
我正在尝试绘制气泡图。我的数据是:
Year<-rep(2001:2005, each = 5)
name<-c("John","Ellen","Mark","Randy","Luisa")
Name<-c(rep(name,5))
Value<-sample(seq(0,25,by=1),25)
mydata<-data.frame(Year,Name,Value)
到目前为止,我已经到了这一点:
ggplot(mydata, aes(x=Year, y=Name, size = Value)) +
geom_point() +
theme(axis.line = element_blank(),
axis.text.x=element_text(size=11,margin=margin(b=10),colour="black"),
axis.text.y=element_text(size=13,margin=margin(l=10),colour="black",
face="italic"),
axis.ticks = element_blank(),
axis.title=element_text(size=18,face="bold"),
panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank(),
legend.text = element_text(size=14),
legend.title = element_text(size=18))
我需要做很多修改,但我不明白该怎么做(我对 ggplot2 不是很熟悉)。
首先,我想使用 viridis
比例,但 scale_color_viridis
和 scale_fill_viridis
都不起作用(我也尝试设置 discrete=T
参数)。
其次,我想避免绘制 0 值(即,在绘制 0 值的地方有一个空白 space),但既不使用 na.omit
(例如 ggplot(na.omit(mydata), aes(x=Year, y=Name, size = Value))
或 ggplot(mydata, aes(x=Year, y=Name, size = na.omit(Value)))
) 或从 Value
对象工作中删除 0。
第三,我希望图例是一个连续的比例:Value
的标绘值在 1 到 25 的范围内(因为我想删除零)但默认图例是离散的,有 5 点中断。
我希望情节看起来或多或少像这样(气泡大小取决于 Value
的值):
有什么建议吗?很抱歉有很多问题,但我在理解 ggplot 的工作原理方面遇到了一些真正的困难。谢谢!
这是你要找的吗?
library(ggplot2)
Year<-rep(2001:2005, each = 5)
name<-c("John","Ellen","Mark","Randy","Luisa")
Name<-c(rep(name,5))
Value<-sample(seq(0,25,by=1),25)
Value <- ifelse(Value == 0, NA, Value)
mydata<-data.frame(Year,Name,Value)
ggplot(mydata, aes(x=Year, y=Name, size = Value, colour = Value)) +
geom_point() +
scale_colour_viridis_c() +
scale_size(guide = F) +
theme(axis.line = element_blank(),
axis.text.x=element_text(size=11,margin=margin(b=10),colour="black"),
axis.text.y=element_text(size=13,margin=margin(l=10),colour="black",
face="italic"),
axis.ticks = element_blank(),
axis.title=element_text(size=18,face="bold"),
panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank(),
legend.text = element_text(size=14),
legend.title = element_text(size=18))
#> Warning: Removed 1 rows containing missing values (geom_point).
关于你的观点:
据我所知,我确实只看到了 scale_colour_viridis_c
和 scale_colour_viridis_b
函数,它们在颜色上有所不同。也许我少了一些包裹?
其次,关于 NA
s:您只需将 0 替换为 NA
s。
最后关于色阶:色阶是自动连续的。连续描述大小有点棘手,因此它总是离散的。但是我为您将其从图例中删除,以便您只有示例中的颜色。
为了将数据中的变量映射到某种比例,您使用 aes()
函数将 ggplot2 调用的 'aesthetic' 耦合到表达式(通常是您的列的符号数据)。因此,要制作色标,您必须在 aes()
函数中指定 colour
美学。在下面的代码中,我还指定了一个 alpha
美学,如果 Value > 0
则为 1,否则为 0,使 0 值点完全透明。我指定 I()
让 ggplot2 知道它应该按字面意思取这个值而不是将它映射到一个比例尺。
library(ggplot2)
#> Warning: package 'ggplot2' was built under R version 4.0.3
Year<-rep(2001:2005, each = 5)
name<-c("John","Ellen","Mark","Randy","Luisa")
Name<-c(rep(name,5))
Value<-sample(seq(0,25,by=1),25)
mydata<-data.frame(Year,Name,Value)
g <- ggplot(mydata, aes(x=Year, y=Name, size = Value)) +
geom_point(aes(colour = Value,
alpha = I(as.numeric(Value > 0))))
一旦我们指定了美学,我们就可以开始自定义比例了。典型的模式是 scale_{the aesthetic}_{type of scale}
,所以如果我们想将颜色值映射到绿色尺度(*_c
用于连续尺度),我们需要添加 scale_colour_viridis_c()
。在比例尺中,我们可以指定例如限制,您已经指出它应该在 1 到 25 之间。另外,我添加了一个 scale_size_area()
,我们说我们不想要点的大小的图例通过设置 `guide = "none".
g + scale_colour_viridis_c(option = "C", direction = -1,
limits = c(1, 25)) +
scale_size_area(guide = "none") +
theme(axis.line = element_blank(),
axis.text.x=element_text(size=11,margin=margin(b=10),colour="black"),
axis.text.y=element_text(size=13,margin=margin(l=10),colour="black",
face="italic"),
axis.ticks = element_blank(),
axis.title=element_text(size=18,face="bold"),
panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank(),
legend.text = element_text(size=14),
legend.title = element_text(size=18))
由 reprex package (v1.0.0)
于 2021-02-24 创建作为思考这个问题的另一种方式...也许它会有所帮助。 :-)
library(tidyverse)
set.seed(123)
df <- tibble(
year = rep(2001:2005, each = 5),
name = rep(c("John","Ellen","Mark","Randy","Luisa"),5),
value = sample(seq(0,25,by=1),25)
)
df %>%
mutate(name_2 = ifelse(year>2001 & year<2005, NA, name)) %>%
ggplot(aes(year, value, group = name, label = name_2, color = name)) +
geom_line() +
geom_point() +
geom_text(vjust = -1) +
scale_color_brewer(palette = "Set1") +
theme_minimal(base_family = "serif") +
theme(legend.position = "none") +
xlab("")