如何在ggplot2中使用指定值缩放y轴

时间:2018-01-06 18:52:00

标签: r ggplot2 scale

我正在尝试将我的y轴缩放为这样:

enter image description here

所以我尝试了以下内容:   scale_y_continuous(breaks = c(0,0.9,0.99,0.999))

然而,结果是:

enter image description here 如何根据指定的数字缩放图表?更具体地说,我可以根据值数组缩放图形吗?比如c =(0,0.9,0.99,0.999)。

这是我到目前为止编写的代码:

async function findChildz(commid) {
  const post = await Comment.findByIdAndUpdate(commid, {$push: {children: newComment}}, {new: true}).exec();
  const dataa = await Comment.find({chapterId: req.body.xxchid}).exec();
  const onlydata = await Comment.find({_id: commid}).exec();
  const childz = await Promise.all(onlydata[0].children.map(child => {
    return Comment.find({ _id: child })
    .exec()
    .then(onlydatac => {
      return onlydatac[0].body;
    });
  }));
  return childz;
}

// then you can simple call the async function like
findChildz(commid)
.then(childz => {
    // you get you childz array
});

示例CSV数据:

library(ggplot2)
library(extrafont)
library(scales)

results = read.csv("results.csv")
breaks = c(0, 0.9, 0.99, 0.999)

ggplot(data=results, aes(x=t, y=Values, group=Algorithm, color = factor(Algorithm), shape = factor(Algorithm))) +
  geom_line(size = 1)+
  theme_bw() +
  theme(legend.position="top") + 
  labs(color="") +
  theme(axis.text=element_text(size=14),
        axis.title=element_text(size=16),
        legend.text=element_text(size=16)) +
  scale_y_log10(breaks=breaks, labels=breaks)

2 个答案:

答案 0 :(得分:2)

根据我从您的数据中理解,您似乎想要放大您的绘图以查看(0.9 - 0.99)范围内的数据是如何分布的。在ggplot中,建议您使用facets来突出显示数据中的重要细分。

您可以选择创建facets,方法是将您的数据划分为多个感兴趣的细分(您的情况范围)。像下面这样的东西会产生你的范围之外的3个部分。

   library(dplyr) 

   results = results %>% 
      mutate(grp = case_when(Values<0.9 ~ "0 - 0.9",
                             Values>=0.9 & Values<0.99 ~ "0.9 - 0.99",
                             Values>=0.99 ~ "0.99+"))

    results %>% 
      ggplot(aes(x = t, y = Values, group = Algorithm, color = Algorithm)) +
      geom_line(size = 1) + 
      facet_wrap(~grp, scales = "free") +
      theme(legend.position="top") + 
      labs(color="") +
      theme(axis.text=element_text(size=14),
            axis.title=element_text(size=16),
            legend.text=element_text(size=16))

enter image description here

或者,您可以选择在一个图表中显示整个数据,并使用您选择的细分创建构面。下面我只展示了一个可以放大的片段。

    plot_df = bind_rows(`All Data` = results, 
                        `Segment (0.9 - 0.99)` = results %>% filter(grp=="0.9 - 0.99"), 
                        .id = "Groups")

    plot_df %>% 
      ggplot(aes(x = t, y = Values, group = Algorithm, color = Algorithm)) +
      geom_line(size = 1) + 
      facet_wrap(~Groups, scales = "free") +
      theme(legend.position="top") + 
      labs(color="") +
      theme(axis.text=element_text(size=14),
            axis.title=element_text(size=16),
            legend.text=element_text(size=16))

enter image description here

在一个情节中打破规模并不是一个好主意,因为它可能导致用户的错误解释。

修改

您问题中的图表可以使用用户定义的比例变换重现,如下所示。

    library(scales)
    foo_trans = function() trans_new("foo", function(x) log(1/(1-x)), function(x) -1/exp(x) + 1)

    results %>% 
      ggplot(aes(x = t, y = Values, group = Algorithm, color = Algorithm)) +
      geom_line(size = 1) + 
      theme(legend.position="top") + 
      labs(color="") + ylab("Values (Tranformed Scale)") +
      theme(axis.text=element_text(size=14),
            axis.title=element_text(size=16),
            legend.text=element_text(size=16)) +
      scale_y_continuous(breaks = c(0,0.9,0.99,0.999), labels = c(0,0.9,0.99,0.999)) +
      coord_trans(y = "foo")

enter image description here

正如您在玩具示例中所看到的,使用代码转换了y轴,并且未应用任何数据转换。计算上可以这样做,但我更喜欢第一种表示方法。您可能需要参考其他答案herehere来解决实际问题。

答案 1 :(得分:0)

您正在寻找scale_y_log10

scale_y_continuous(breaks=c(0, 0.9, 0.99, 0.999))替换为scale_y_log10(breaks=c(0, 0.9, 0.99, 0.999))