You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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"))

关键修改说明

  1. 生成城市排序:通过summarize计算每个城市的汽车拥有率差值,按差值降序排列后提取城市名称,得到目标排序顺序。
  2. 转换为有序因子:将原数据中的city列转换为因子,指定levels为上面得到的排序顺序,ggplot会自动按这个顺序渲染y轴。
  3. 修正原代码问题:补全scale_color_brewer的direction参数值为1,修正x轴标签的语法错误,简化axis.ticks.y的颜色设置。

内容的提问来源于stack exchange,提问作者Santiago99

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 22:35:48