假设我在R中有3列数据:

  1. 类型:‘A’B‘’C‘D’E‘F’g‘
  2. 取值:UT 30 45 50 62 70 72
  3. 效率:70 72 80 88 90 92 98

我只想把‘Value’栏中的‘Numerical’数据以20为增量并显示在X轴上,同时保留‘Text’值不变[这样x轴将显示:ut30-50 50-70-90],而在Y轴上显示‘Efficiency’, colored颜色 =TYPE.

将数值数据类型打包似乎很简单: Bins<-seq(30,80,by=20)然后策划,但拥有那个‘UT’给了我一个真正的挑战.

我是个新手,只是玩玩而已

#create bins
bins <- seq(30, 90, by = 20) 

#create plot 
ggplot(df, aes(x = cut(`Value`, breaks = bins, labels = sprintf("%d-%d", bins[-length(bins)], bins[-1])), y = 'Efficiency', color = `Type`)) 

推荐答案

df <- data.frame(
  Type = c("A", "B", "C", "D", "E", "F", "G"),
  Value = c("UT", "30", "45", "50", "62", "70", "72"),
  Efficiency = c(70, 72, 80, 88, 90, 92, 98)
)

退一步考虑数据集的组织.字符串中的列是单一类型的向量,因此通过在该列中包含"UT",这是一个字符列:

dplyr::glimpse(df)
Rows: 7
Columns: 3
$ Type       <chr> "A", "B", "C", "D", "E", "F", "G"
$ Value      <chr> "UT", "30", "45", "50", "62", "70", "72"
$ Efficiency <dbl> 70, 72, 80, 88, 90, 92, 98

你的Value列似乎来自数字数据,但你有令人讨厌的UT.在这种情况下,我认为最好更详细地了解数据帧,以便更准确地描述情况:

# New column to give context to the value column
df$Value_type <- ifelse(df$Value == "UT", "UT", NA)
df$Value[df$Value == "UT"] <- NA
df$Value <- as.numeric(df$Value)

# Categories for the Value column
df <- df |>
  dplyr::mutate(Value_cat = dplyr::case_when(
    30 <= Value & Value < 50 ~ "30-50",
    50 <= Value & Value < 70 ~ "50-70",
    70 <= Value & Value < 90 ~ "70-90",
    Value_type == "UT" ~ "UT",
    .default = NA
  ))

# Set factor levels so that any plots have desired order 
df$Value_cat <- factor(df$Value_cat, levels = c(
  "UT", "30-50", "50-70", "70-90"
))

dplyr::glimpse(df)
Rows: 7
Columns: 5
$ Type       <chr> "A", "B", "C", "D", "E", "F", "G"
$ Value      <dbl> NA, 30, 45, 50, 62, 70, 72
$ Efficiency <dbl> 70, 72, 80, 88, 90, 92, 98
$ Value_type <chr> "UT", NA, NA, NA, NA, NA, NA
$ Value_cat  <fct> UT, 30-50, 30-50, 50-70, 50-70, 70-90, 70-90

现在我们更接近传说中的"整齐"数据集:行是每个单独的观察值,每个观察值具有在单独的变量/列中定义良好的特征.您还可以方便地以数字向量形式访问您的Value个测量值.当您需要编写关于数字属性的任何类型的逻辑时,避免将数字转换为字符串通常是好的.

因为你有一个类别"UT",你的x轴是分类的,而不是数字.我建议使用从这些类别创建的"bin"条形图,而不是设置bin宽度的直方图,因为直方图通常用于连续的数值数据.

library(ggplot2)
# Since your `fill` is not 1:1 with your x-axis, you can set
# the position of the bars in the position argument
ggplot(data = df, mapping = aes(x = Value_cat, y = Efficiency)) +
  geom_col(aes(fill = Type), position = position_dodge())

R相关问答推荐

geom_raster不适用于x比例中超过2,15的值

R形式的一维数字线/箱形图样式图表

在边界外添加注释或标题

带有gplot 2的十字舱口

在R中查找每个组不同时间段的总天数

带有叠加饼图系列的Highmap

基于不同组的列的相关性

gganimate在使用shadow_mark选项时不保留所有过go 的标记

在R中将特定列的值向右移动

bslib::card_header中的shine::downloadButton,图标而不是文本

当我们有多个特殊字符时,使用gsub删除名称和代码'

根据日期从参考帧中创建不同的帧

如何在PackageStatus()中列出&q;不可用的包&q;?

删除字符串R中的重复项

在不重复主题的情况下重新排列组

将美学添加到ggploy中的文本标签

通过比较来自多个数据框的值和R中的条件来添加新列

R/shiny APP:如何充分利用窗口?

如何修改Rust中的R字符串并将其赋给新的R变量,并使用extendr保留原始R字符串

基于已有ID列创建唯一ID