如何在R中按年份差值重新排序点图(Dot Plot)
按汽车拥有率差值排序城市的点图优化
数据集
我有1992至1999年间5个城市的居民汽车拥有率百分比数据,数据集的R代码如下:
city <- c("A", "A", "B", "B", "F", "F", "T", "T", "C", "C") year <- c("1992", "1999", "1992", "1999", "1992", "1999", "1992", "1999", "1992", "1999") # 汽车拥有率 car_owner <- c("15.9", "75.6", "35.8", "95.2", "15.9", "74", "6", "64", "41", "97.9") df <- data.frame(city, year, car_owner) df$car_owner <- as.numeric(df$car_owner)
现有绘图代码
我用以下代码绘制了点图,已展示全部信息,但需要调整城市排序:
df %>% group_by(city) %>% mutate(Difference = car_owner - lead(car_owner), Position = car_owner - (0.5 * Difference)) %>% ggplot(aes(x = car_owner, y = city))+ geom_vline(xintercept = c(), lty = 2, alpha = 0.5) + geom_line(aes(group = city)) + geom_point(aes(color = year), size=3) + geom_text(aes(label = abs(Difference), y = city, x = Position), nudge_y = 0.2) + theme_classic(base_size = 12) + labs(x = "Car owner)")+ theme(legend.position = "top") + scale_color_brewer(palette = "Accent", direction = ) + theme(axis.ticks.y = element_line(colour = c("transparent", rep("black", 12))))
需求
希望按1992-1999年汽车拥有率的差值大小对图中城市排序,顺序为:A(差值59.9个百分点)、B、F、T、C。
修改后的代码
要实现按差值排序,核心是将city转换为有序因子,指定按差值降序排列的层级。修改后的完整代码如下:
library(dplyr) library(ggplot2) # 先计算每个城市的差值并排序,获取城市顺序 city_order <- df %>% group_by(city) %>% summarize(diff = abs(car_owner[year == "1999"] - car_owner[year == "1992"])) %>% arrange(desc(diff)) %>% pull(city) # 将city转换为有序因子,指定排序层级 df$city <- factor(df$city, levels = city_order) # 绘图(同时修正原代码中的小错误) df %>% group_by(city) %>% mutate(Difference = car_owner - lead(car_owner), Position = car_owner - (0.5 * Difference)) %>% ggplot(aes(x = car_owner, y = city))+ geom_line(aes(group = city)) + geom_point(aes(color = year), size=3) + geom_text(aes(label = abs(Difference), y = city, x = Position), nudge_y = 0.2) + theme_classic(base_size = 12) + labs(x = "汽车拥有率(%)", y = "城市")+ theme(legend.position = "top") + scale_color_brewer(palette = "Accent", direction = 1) + theme(axis.ticks.y = element_line(colour = "black"))
关键修改说明
- 生成城市排序:通过
summarize计算每个城市的汽车拥有率差值,按差值降序排列后提取城市名称,得到目标排序顺序。 - 转换为有序因子:将原数据中的
city列转换为因子,指定levels为上面得到的排序顺序,ggplot会自动按这个顺序渲染y轴。 - 修正原代码问题:补全
scale_color_brewer的direction参数值为1,修正x轴标签的语法错误,简化axis.ticks.y的颜色设置。
内容的提问来源于stack exchange,提问作者Santiago99
相关产品推荐
相关产品推荐

