我对 R 非常陌生。我昨天才开始。
我正在尝试制作五种不同 pH 条件下吸光度与波长的散点图。 图例按 pH 1、10、4、7、8 的顺序显示,但我希望它是 1、4、7、8、10。 我不知道如何重新排序图例。
目前,pH 值是一个字符。我尝试将其设为数字,这确实将图例按正确的顺序排列,但我无法为每个 pH 值选择特定的颜色。我不想要渐变。 (说明一下,图例图像中的颜色是正确的。只是 pH 的顺序是错误的。)
这就是我的代码的图形部分的样子。
pH_character %>% #imported data frame
group_by(Wavelength, pH) %>%
summarize(mean_abs = mean(Absorbance), se_abs = sd(Absorbance)/sqrt(3)) %>% #for error bars later
ggplot(aes(Wavelength, mean_abs, color = pH)) +
geom_point(size = 1) +
scale_color_manual(values = c("#ff1934","black","#ffc273","#ff6721","#702400")) + #the colors I need
geom_errorbar(aes(x = Wavelength,
ymin = mean_abs - 2*se_abs,
ymax = mean_abs + 2*se_abs,
width = 5)) +
scale_x_continuous(expand = c(0,0), limits = c( 400,700)) +
scale_y_continuous(expand = c(0,0), limits = c(0,2)) +
labs(x="Wavelength (nm)", y="Absorbance")
我还尝试了
group_by(pH, Wavelength)
而不是 group_by(Wavelength, pH)
,以便总结按 pH 值对输出进行分组,但这对图例顺序没有任何影响,因为输出仍然按 pH 1、10、4、7 的顺序组织, 8.
编辑:这是假数据的代码:
pH_character <- data.frame(Wavelength=c(430, 430, 430, 430, 430, 470, 470, 470, 470, 470, 565, 565, 565, 565, 565, 635, 635, 635, 635, 635),
pH=c("1", "4", "7", "8", "10", "1", "4", "7", "8", "10", "1", "4", "7", "8", "10", "1", "4", "7", "8", "10"),
Absorbance=c(0.96533, 0.83866, 1.268, 1.371, 1.5, 0.78333, 0.617333, 1.192, 1.38566, 1.5, 0.243, 0.12833, 0.22233, 0.26966, 1.5, 0.06566, 0.05, 0.0833, 0.104, 1.5))
这实际上只是除 pH 10 之外的平均数据,因此不会有误差线(但仍然存在同样的问题)
正如我在评论中提到的,您可以通过转换为
factor
来获得您想要的顺序,并按照您想要的顺序设置级别的顺序。
在您的情况下,可以使用
factor(as.numeric(pH))
将 pH
转换为 factor
轻松实现,并根据数值设置级别顺序。
注意:您可能还必须重新排序颜色矢量以反映
pH
的更改顺序。
library(dplyr)
library(ggplot2)
pH_character %>%
group_by(Wavelength, pH) %>%
summarize(
mean_abs = mean(Absorbance),
se_abs = sd(Absorbance) / sqrt(3),
) %>%
mutate(pH = factor(as.numeric(pH))) %>%
ggplot(aes(Wavelength, mean_abs, color = pH)) +
geom_point(size = 1) +
scale_color_manual(
values = c("#ff1934", "black", "#ffc273", "#ff6721", "#702400")
) +
geom_errorbar(aes(
x = Wavelength,
ymin = mean_abs - 2 * se_abs,
ymax = mean_abs + 2 * se_abs,
width = 5
)) +
scale_x_continuous(
expand = c(0, 0),
limits = c(400, 700)
) +
scale_y_continuous(
expand = c(0, 0),
limits = c(0, 2)
) +
labs(
x = "Wavelength (nm)",
y = "Absorbance"
)