为R中的每个X值构建一个特定的秩图,

zkure5ic  于 2023-10-13  发布在  其他
关注(0)|答案(1)|浏览(106)

亲爱的Stack Overflow社区,
我是R的新手,我想构建一个非常具体的图表,但与ggplot语言斗争。基本上,这是我的数据集的玩具版本,由dput命令给出:

structure(list(rank = structure(1:15, levels = c("1", "2", "3", 
"4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", 
"16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", 
"27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", 
"38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", 
"49", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59", 
"60", "61", "62", "63", "64", "65", "66", "67", "68", "69", "70", 
"71", "72", "73", "74", "75"), class = "factor"), year = c("1986", 
"1986", "1986", "1986", "1986", "1986", "1986", "1986", "1986", 
"1986", "1986", "1986", "1986", "1986", "1986"), name = c("SectionA", 
"SectionB", "SectionC", "SectionD", "SectionE", "SectionF", 
"SectionG", "SectionH", "SectionI", "SectionJ", "SectionK", 
"SectionL", "SectionM", "SectionN", "SectionO"), section = structure(c(1L, 
1L, 1L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 2L), levels = c("0", 
"1"), class = "factor"), id = c("ID1", "ID1", "ID2", "ID3", "ID4", 
"ID5", "ID6", "ID7", "ID8", "ID9", "ID10", "ID11", "ID12", "ID13", "ID14")), row.names = c(NA, -15L), class = c("tbl_df", "tbl", "data.frame"))

我的数据集存储有关调查的不同部分和子部分的信息,这些信息随着时间的推移而演变。由此产生了两个挑战:

  • 第一年的一个部分可以是第二年的一个子部分。
  • 第一年的一个部分在第二年可以有另一个名字,同时包含完全相同类型的问题。

为了解决问题1,变量“section”在这里用于评估节名(包含在变量“name”中)是节(== 0)还是最后一节(== 1)的子节。问题2的解决要归功于变量ID,它或多或少地解释了具有相似主题特征的部分名称。
最后,变量“rank”存储该部分在调查问卷中的位置。因此,调查问卷的第一部分将具有rank == 1。
我想做的是一个图表,X轴是我的年份变量(1986年,1992年,1998年......),Y轴是我的排名变量。每一年将包含两个竖条:在左侧,所有部分的位置(section == 0),在右侧,所有子部分的位置(section == 1)。由于包含的部分和子部分都有一个等级变量,因此一年中不会有两个具有相同Y坐标的点。诀窍是,我希望在不同时间共享类似“id”值的部分和子部分具有相同的颜色,但我希望写作是由“name”给出的,这样每个人都可以看到调查问卷的措辞是如何为类似的主题改变的,即使顺序已经改变。
由于我无法用语言更好地描述它,我做了一个小的表示,我想做的油漆:
enter image description here
在这个例子中,你可以看到1986年的A部分变成了1992年的U部分(比如,它从“财富描述”变成了“财富”)。但由于它们将共享相同的标准化ID,因此它们将以相同的颜色显示。
我真的很感激你能在这个问题上提供任何帮助!
最好的,

2hh7jdfx

2hh7jdfx1#

希望这能让你开始

library(tidyverse)
df0 <- structure(list(rank = structure(1:15, levels = c(
  "1", "2", "3",
  "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15",
  "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26",
  "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37",
  "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48",
  "49", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59",
  "60", "61", "62", "63", "64", "65", "66", "67", "68", "69", "70",
  "71", "72", "73", "74", "75"
), class = "factor"), year = c(
  "1986",
  "1986", "1986", "1986", "1986", "1986", "1986", "1986", "1986",
  "1986", "1986", "1986", "1986", "1986", "1986"
), name = c(
  "SectionA",
  "SectionB", "SectionC", "SectionD", "SectionE", "SectionF",
  "SectionG", "SectionH", "SectionI", "SectionJ", "SectionK",
  "SectionL", "SectionM", "SectionN", "SectionO"
), section = structure(c(
  1L,
  1L, 1L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 2L
), levels = c(
  "0",
  "1"
), class = "factor"), id = c(
  "ID1", "ID1", "ID2", "ID3", "ID4",
  "ID5", "ID6", "ID7", "ID8", "ID9", "ID10", "ID11", "ID12", "ID13", "ID14"
)), row.names = c(NA, -15L), class = c("tbl_df", "tbl", "data.frame"))

df0$id <- factor(df0$id, levels = unique(df0$id))
df0$rank <- as.integer(as.character(df0$rank))
df0$year <- as.integer(as.character(df0$year))
df0$section <- as.integer(as.character(df0$section))

df2 <- bind_rows(
  df0,
  df0 |> mutate(year = 1987)
) |>
  mutate(xvar = year + ((section - .5) / 2))

ggplot(data = df2) +
  aes(
    x = xvar,
    y = rank,
    label = name,
    color = id
  ) +
  geom_point() +
  geom_text(nudge_x = .2) +
  scale_x_continuous(
    breaks = seq(from = 1986, to = 1987, by = 1),
    limits = c(1985, 1988)
  ) +
  scale_y_continuous(breaks = 1:15, trans = scales::reverse_trans())

相关问题