Arch Arch - 1 year ago 104
R Question

Adding horizontal lines to log transformed axes in ggplot2

I want to add horizontal and vertical lines to my plot which has a log-transformed x-axis. If I cut the code, before the 'axes' transformation, everything plots as expected (code below). #image:

. I had searched the stack but a google search just turned up this relevant thread.

Additionally, I am having difficulties with Aesthetic aspects, such as theme(legend.background.color, and grid lines.... - they are not appearing)

solved this secondary issue: for background color use [fill="lightblue"] for the gridlines, the size was too small (.01) - changed to (.5)

enter image description here

If I run the full code I receive the following warning message(no lines are plotted)

Warning messages:
1: In self$trans$x$transform(x) : NaNs produced
2: In trans$transform(value) : NaNs produced


enter image description here

geom_hline #is not being plotted.

geom_vline is now being plotted - which is strange because earlier it wasn't either.

ggplot(all_mydata, aes(x=dose,y=probability))+
geom_ribbon(data=p_df_all, aes(ymin=Lower,ymax=Upper, col="blue"))+
geom_step(data=p_df_all, aes(x=dose,y=probability, col="green",(linetype="dotdash")))+
geom_hline(yintercept = 1)+

geom_vline(xintercept = 10^10)+

coord_trans(x = 'log10', limx = c(0.01,10000), limy=c(0.0001,1.1))+

annotation_logticks(scaled = FALSE) +
scale_x_continuous(breaks = trans_breaks("log10", function(x) 10^x),
labels = trans_format("log10", math_format(10^.x)))+

xlab("log10 transformed") + ylab("0-1")+

#Plot aesthetics:
theme(panel.background = element_rect(color = "red"), #isn't working
panel.grid.major=element_line(color="green",size=.01))+ #isn't working

theme(legend.position = c(.2, .7))+ #this works
theme(legend.background=element_rect(color="black")) #this doesn't

Data (2 variables)

all_mydata <- structure(list(dose = c(3, 3, 25, 25, 25, 50, 50, 50), total = c(25L,25L, 25L, 25L, 25L, 25L, 25L, 25L), affected = c(1L, 3L, 22L, 14L, 22L, 23L, 16L, 21L), probability = c(0.04, 0.12, 0.88, 0.56, 0.88, 0.92, 0.64, 0.84), model = c("mod1", "mod1", "mod1", "mod1", "mod1", "mod1", "mod1", "mod1")), .Names = c("dose", "total", "affected", "probability", "model"), row.names = c(1L, 2L, 51L, 52L, 53L, 73L, 74L, 75L), class = "data.frame")

p_df_all <-structure(list(dose = c(1.0001, 1.04747510870603, 10.1171372457295, 10.5963897972846, 11.0983447203301, 9547.72091181669, 10000),
probability = c(0.0683999851683096, 0.0710791589380873, 0.366688095557777,
0.376331202778934, 0.386073310136858, 0.996189526007837,
0.996343135145175), Lower = c(0.0490006092001366, 0.0512942391381131,
0.342265517182034, 0.35200684160253, 0.361817143260538, 0.993441634537481,
0.993687296620045), Upper = c(0.0877993611364827, 0.0908640787380616,
0.39111067393352, 0.400655563955339, 0.410329477013178, 0.998937417478193,
0.998998973670305), model = c("mod1", "mod1", "mod1", "mod1",
"mod1", "mod1", "mod1")), .Names = c("dose", "probability", "Lower", "Upper", "model"), row.names = c(1L, 2L, 51L, 52L, 53L, 199L, 200L), class = "data.frame")

Answer Source

Here is a version of the plot with all the theme elements working, the log scale implemented without a coordinate transformation, and the minor log tick-marks still present. I've mostly left your color choices intact, but changed a few things to make them show up better. The color combinations clash badly, so let me know if this is really what you had in mind. In the code below, the comments refer to the line(s) of code just below the comment.

ggplot(all_mydata, aes(x=dose,y=probability)) +
  geom_point(col="orange", size=4) +
  # To generate an informative legend without mapping to a data column,
  #  use informative names for the colour aesthetics
  geom_ribbon(data=p_df_all, aes(ymin=Lower, ymax=Upper, colour="Ribbon"), 
              fill="yellow", size=1) +
  # Move linetype outside of aes so that it will be interpreted literally,
  #  rather than as an aesthetic mapping
  geom_step(data=p_df_all, aes(x=dose, y=probability, colour="Dashed Line"), 
            linetype="dotdash", size=1) +      
  geom_hline(yintercept = 1) +
  geom_vline(xintercept = 10^10) +
  # Remove coordinate transformation
  #coord_trans(x = 'log10', limx = c(0.01,10000), limy=c(0.0001,1.1)) +
  # Change to scaled = TRUE 
  annotation_logticks(scaled = TRUE, sides="b")  +
  scale_x_log10(breaks = 10^(-1:10),
                labels = trans_format("log10", math_format(10^.x))) +
  # This is where you set the colors for the colour aesthetic
  scale_colour_manual(values=c("Ribbon"="blue", "Dashed Line"="green")) +
  xlab("log10 transformed")  + ylab("0-1") +
        # Use fill to set background color
  theme(panel.background = element_rect(fill = "red"),
        # Set a larger size, so that grid lines will be visible
        panel.grid.major=element_line(color="green", size=.3),
        legend.position = c(.8, .7),
        # Set legend title and text "white" so they're visible with "black" background
        legend.title = element_text(colour="white"),
        legend.text = element_text(colour="white"),
        # Use fill to set background color

enter image description here

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download