简体   繁体   English

在ggplot2中的log10刻度轴上将y轴扩展为负数

[英]Expand y axis to negative numbers on a log10 scale axis in ggplot2

I am plotting a combination of points and lines with 2 sets of labels. 我正在绘制带有2组标签的点和线的组合。 I want to plot the labels above and below the points as you can see below. 我想在点的上方和下方绘制标签,如下所示。 At the same time to make it better to read I have used the log10 scale on the y axis and everything is fine except some of the labels are outside of the chart area and I have used and tried every method suggested in many posts to see if I get any favorable result or not. 同时为了更好地阅读,我在y轴上使用了log10刻度,并且一切正常,除了一些标签不在图表区域之外,而且我已经使用并尝试了许多帖子中建议的每种方法,以查看是否我有没有得到满意的结果。 I am looking for either of the solutions: 我正在寻找以下任一解决方案:

1- expand the y axis to negative so that the labels can be seen. 1-将y轴扩展为负数,以便可以看到标签。 Note that ylim or limits=c(x,y) is not working for log scale or sqrt scale if the numbers are negative 请注意,如果数字为负,则ylimlimits=c(x,y)不适用于对log刻度或sqrt刻度

2- trick the geom_text to make the labels be visible regardless of the y limits. 2-欺骗geom_text以使标签可见,而与y限制无关。 Note that I have tried vjust="inward" and it is working ok, but then I have to use geom_text_repel which moves the labels around and makes it hard to read, so I still like to place the labels right on top and bottom of the points 请注意,我已经尝试过vjust="inward" ,并且可以正常工作,但是随后我必须使用geom_text_repel来移动标签,使标签难以阅读,因此我仍然喜欢将标签放在标签的顶部和底部点数

any helps is appreciated! 任何帮助表示赞赏!

Here is the code to generate the data frame: 这是生成数据帧的代码:

df1_InSAP_Only <- structure(list(Year_Month = c(
    "2016_06", "2016_06", "2016_07", 
    "2016_07", "2016_08", "2016_08", "2016_09", "2016_09", "2016_09", 
    "2016_09", "2016_10", "2016_10", "2016_10", "2016_10", "2016_11", 
    "2016_11", "2016_12", "2016_12", "2017_01", "2017_01", "2017_01", 
    "2017_02", "2017_02", "2017_02", "2017_02", "2017_03", "2017_03", 
    "2017_03", "2017_03", "2017_03", "2017_03", "2017_04", "2017_04", 
    "2017_04", "2017_04", "2017_04", "2017_05", "2017_05", "2017_05", 
    "2017_05", "2017_05", "2017_05", "2017_06", "2017_06", "2017_06", 
    "2017_06", "2017_06", "2017_06", "2017_07", "2017_07"), 
    Business = c("A", 
     "E", "A", "B", "B", "E", "F", "A", "H", "B", "A", "D", "B", "E", 
     "B", "E", "F", "B", "F", "B", "E", "A", "B", "C", "E", "F", "A", 
     "G", "D", "B", "E", "F", "A", "G", "B", "E", "F", "A", "D", "B", 
     "C", "E", "F", "A", "D", "B", "C", "E", "F", "A"),
    `MMR Count` = c(2L, 
      1L, 1L, 7L, 2L, 1L, 1L, 3L, 1L, 5L, 1L, 1L, 4L, 1L, 8L, 4L, 1L, 
      4L, 2L, 2L, 2L, 3L, 8L, 1L, 2L, 1L, 7L, 1L, 4L, 9L, 2L, 4L, 10L, 
      2L, 15L, 7L, 4L, 27L, 2L, 14L, 1L, 6L, 9L, 31L, 5L, 14L, 1L, 
      4L, 5L, 21L),
     `Duration Average` = c(37, 20, 9, 8, 2, 5, 1, 1, 
      1, 14, 1, 19, 8, 1, 21, 77, 1, 18, 8, 1, 1, 194, 9, 14, 19, 1, 
      10, 1, 6, 9, 18, 4, 12, 170, 7, 35, 9, 10, 7, 12, 3, 15, 5, 9, 
      10, 10, 18, 11, 16, 14)), .Names = c("Year_Month", "Business", 
      "MMR Count", "Duration Average"), row.names = c(NA, 50L), class = "data.frame")

Here is the code that generates the plot: 这是生成绘图的代码:

library(ggplot2)
ggplot(df1_InSAP_Only,
        aes(x=Year_Month,
            y=`Duration Average`,
            group=Business,
            color=Business,
            size=`MMR Count`)) +
  geom_line(aes(group=Business),stat="identity", size=1, alpha=0.7) +
  geom_point(aes(colour=Business, alpha=0.7)) +
  facet_wrap(~ Business, ncol=2) +
  scale_y_log10( limits=c(-100,1000),breaks=c(0,1,10,100,1000)) +   
  scale_alpha_continuous(range = c(0.5,1), guide='none') + #remove the legend for alpha
  geom_text(data=. %>% dplyr::group_by(Business),
            aes(label=`Duration Average`,vjust=-2),
            size=3,
            position = position_dodge(width=0.9)) +
  geom_text(data=. %>% dplyr::group_by(Business),
            aes(label=`MMR Count`,vjust=3),
            size=3,
            position = position_dodge(width=0.9),
            color="brown")

and here is the plot: 这是情节:

在此处输入图片说明

You can't make a logged y-scale go negative - logs of a negative number are undefined. 您无法使已记录的y比例变为负数-未定义负数的对数。 Just make it go closer to 0. Here's your graph with 使其接近0即可。这是您的图形

scale_y_log10(limits=c(.1, 1000),breaks=c(1, 10, 100, 1000))

在此处输入图片说明

If you want more (will depend on the size of the final plot, size of the text, amount of your vjust ), go to 0.05, or 0.01... 如果您想要更多(取决于最终绘图的大小,文本的大小, vjust量),请转到0.05或0.01 ...

I'd also highly recommend using a Date format for your x-axis data, look how much nicer these axis labels are (and how the plot looks cleaner with fewer vertical gridlines). 我还强烈建议您为x轴数据使用Date格式,看看这些轴标签好得多(以及在垂直网格线更少的情况下绘图看起来更清晰)。

df1_InSAP_Only$date = as.Date(paste0(df1_InSAP_Only$Year_Month, "_01"), format = "%Y_%m_%d")

 # use date column on x-axis
 # reduce vjust amounts
 # get rid of meaningless group_by() statements
 # get rid of unused position dodges
ggplot(df1_InSAP_Only,
        aes(x=date,
            y=`Duration Average`,
            group=Business,
            color=Business,
            size=`MMR Count`)) +
  geom_line(aes(group=Business),stat="identity", size=1, alpha=0.7) +
  geom_point(aes(colour=Business, alpha=0.7)) +
  facet_wrap(~ Business, ncol=2) +
  scale_y_log10( limits=c(.1,1000),breaks=c(1,10,100,1000)) +   
  scale_alpha_continuous(range = c(0.5,1), guide='none') + #remove the legend for alpha
  geom_text(aes(label=`Duration Average`,vjust=-1),
            size=3) +
  geom_text(aes(label=`MMR Count`,vjust=2),
            size=3,
            color="brown")

在此处输入图片说明

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM