2013-07-19 14 views
10

Czy istnieje sposób na uzyskanie osi, z etykietami na środku wykresu ggplot2, jak tradycyjny kalkulator graficzny? Przejrzałem dokumenty i wydaje się, że nie ma takiej funkcjonalności, ale inne pakiety kreślenia nie są tak konfigurowalne graficznie, jak ggplot2. Aby wyjaśnić, szukałem, aby przejść od czegoś takiego:Środek oś xi ggplot2

ggplot

do tego:

mathematica

Pierwsza działka jest wykonany z następującego kodu:

dat = data.frame(x = 1, y =1) 
p = ggplot(data = dat, aes(x=x, y=y)) + geom_point(size = 5) 
p + xlim(-2,2) + ylim(-2,2) 

Drugi dział jest wykonany za pomocą Mathematica. Głównym problemem, jaki mam, jest ustalenie, w jaki sposób oś, z etykietami, powinna iść do środka (mogę sprawić, że temat będzie pusty itd., Bez problemu). Wydaje się, że nie ma żadnego parametru tematu, który można edytować, aby uczynić to szybką naprawą.

+1

można dostarczyć obraz, który pokazuje swój pożądany wynik? – ialm

+0

@ialm Dodałem w niektórych wyjaśnieniach – user2407894

+0

Jestem prawie pewien, że nie ma, ale nie mogę znaleźć źródła, które stwierdza ostatecznie, że nie możesz. –

Odpowiedz

1

Po prostu użyłbym xlim i ylim.

dat = data.frame(x = 1, y =1) 
p = ggplot(data = dat, aes(x=x, y=y)) + 
    geom_point(size = 5) + 
    xlim(-2, 2) + 
    ylim(-2, 2) 
p 

screenshot

+0

To prawda, że ​​jest to sposób na wyśrodkowanie. Ale nie wydaje się, że istnieje "tryb", a nawet prosty sposób pozycjonowania rzeczywistych osi w środku, jak widać na wykresie Mathematica. – user2407894

+0

Cóż, jest to wystarczająco proste. Po prostu nie jest do tego przyzwyczajony. To jest R, nie Mathematica. – SlowLearner

+0

Rozumiem to.Nie sądzę, że rozumiesz to pytanie. – user2407894

1

pierwszym przybliżeniu:

dat = data.frame(x = 1, y =1) 
p = ggplot(data = dat, aes(x=x, y=y)) + theme_bw() + 
    geom_point(size = 5) + 
    geom_hline(aes(y = 0)) + 
    geom_vline(aes(x = 0)) 

Plot

Regulacja limitów za odpowiedź SlowLearner użytkownika.

+0

Więc jeśli chciałbym etykiety osi na liniach, musiałbym je narysować? – user2407894

+0

@ user2407894: Tak, linie są prostymi liniami, bez etykiet i tyknięć. – krlmlr

6

myślę, że to jest to, czego szukasz:

enter image description here

Mam skonstruował funkcję, która właśnie to robi:

theme_geometry <- function(xvals, yvals, xgeo = 0, ygeo = 0, 
          color = "black", size = 1, 
          xlab = "x", ylab = "y", 
          ticks = 10, 
          textsize = 3, 
          xlimit = max(abs(xvals),abs(yvals)), 
          ylimit = max(abs(yvals),abs(xvals)), 
          epsilon = max(xlimit,ylimit)/50){ 

    #INPUT: 
    #xvals .- Values of x that will be plotted 
    #yvals .- Values of y that will be plotted 
    #xgeo .- x intercept value for y axis 
    #ygeo .- y intercept value for x axis 
    #color .- Default color for axis 
    #size .- Line size for axis 
    #xlab .- Label for x axis 
    #ylab .- Label for y axis 
    #ticks .- Number of ticks to add to plot in each axis 
    #textsize .- Size of text for ticks 
    #xlimit .- Limit value for x axis 
    #ylimit .- Limit value for y axis 
    #epsilon .- Parameter for small space 


    #Create axis 
    xaxis <- data.frame(x_ax = c(-xlimit, xlimit), y_ax = rep(ygeo,2)) 
    yaxis <- data.frame(x_ax = rep(xgeo, 2), y_ax = c(-ylimit, ylimit)) 

    #Add axis 
    theme.list <- 
    list(
    theme_void(), #Empty the current theme 
    geom_line(aes(x = x_ax, y = y_ax), color = color, size = size, data = xaxis), 
    geom_line(aes(x = x_ax, y = y_ax), color = color, size = size, data = yaxis), 
    annotate("text", x = xlimit + 2*epsilon, y = ygeo, label = xlab, size = 2*textsize), 
    annotate("text", x = xgeo, y = ylimit + 4*epsilon, label = ylab, size = 2*textsize), 
    xlim(-xlimit - 7*epsilon, xlimit + 7*epsilon), #Add limits to make it square 
    ylim(-ylimit - 7*epsilon, ylimit + 7*epsilon) #Add limits to make it square 
) 

    #Add ticks programatically 
    ticks_x <- round(seq(-xlimit, xlimit, length.out = ticks),2) 
    ticks_y <- round(seq(-ylimit, ylimit, length.out = ticks),2) 

    #Add ticks of x axis 
    nlist <- length(theme.list) 
    for (k in 1:ticks){ 

    #Create data frame for ticks in x axis 
    xtick <- data.frame(xt = rep(ticks_x[k], 2), 
         yt = c(xgeo + epsilon, xgeo - epsilon)) 

    #Create data frame for ticks in y axis 
    ytick <- data.frame(xt = c(ygeo + epsilon, ygeo - epsilon), 
         yt = rep(ticks_y[k], 2)) 

    #Add ticks to geom line for x axis 
    theme.list[[nlist + 4*k-3]] <- geom_line(aes(x = xt, y = yt), 
             data = xtick, size = size, 
             color = color) 

    #Add labels to the x-ticks 
    theme.list[[nlist + 4*k-2]] <- annotate("text", 
              x = ticks_x[k], 
              y = ygeo - 2.5*epsilon, 
              size = textsize, 
              label = paste(ticks_x[k])) 


    #Add ticks to geom line for y axis 
    theme.list[[nlist + 4*k-1]] <- geom_line(aes(x = xt, y = yt), 
              data = ytick, size = size, 
              color = color) 

    #Add labels to the y-ticks 
    theme.list[[nlist + 4*k]] <- annotate("text", 
              x = xgeo - 2.5*epsilon, 
              y = ticks_y[k], 
              size = textsize, 
              label = paste(ticks_y[k])) 
    } 

    #Add theme 
    #theme.list[[3]] <- 
    return(theme.list) 
} 

Jako przykład można uruchomić poniższy kod, żeby utwórz obraz podobny do powyższego:

simdata <- data.frame(x = rnorm(50), y = rnorm(50)) 

ggplot(simdata) + 
    theme_geometry(simdata$x, simdata$y) + 
    geom_point(aes(x = x, y = y), size = 3, color = "red") + 
    ggtitle("More geometric example") 

ggsave("Example1.png", width = 10, height = 10) 
0

Istnieje kilka innych użytecznych odpowiedzi, ale po zbliża się do celu wizualny i pozwala uniknąć pętli:

enter image description here

library(ggplot2) 
library(magrittr) 

# constants 
axis_begin <- -2 
axis_end <- 2 
total_ticks <- 21 

# DATA ---- 
# point to plot 
my_point <- data.frame(x=1,y=1) 

# chart junk data 
tick_frame <- 
    data.frame(ticks = seq(axis_begin, axis_end, length.out = total_ticks), 
      zero=0) %>% 
    subset(ticks != 0) 

lab_frame <- data.frame(lab = seq(axis_begin, axis_end), 
         zero = 0) %>% 
    subset(lab != 0) 

tick_sz <- (tail(lab_frame$lab, 1) - lab_frame$lab[1])/128 

# PLOT ---- 
ggplot(my_point, aes(x,y)) + 

    # CHART JUNK 
    # y axis line 
    geom_segment(x = 0, xend = 0, 
       y = lab_frame$lab[1], yend = tail(lab_frame$lab, 1), 
       size = 0.5) + 
    # x axis line 
    geom_segment(y = 0, yend = 0, 
       x = lab_frame$lab[1], xend = tail(lab_frame$lab, 1), 
       size = 0.5) + 
    # x ticks 
    geom_segment(data = tick_frame, 
       aes(x = ticks, xend = ticks, 
        y = zero, yend = zero + tick_sz)) + 
    # y ticks 
    geom_segment(data = tick_frame, 
       aes(x = zero, xend = zero + tick_sz, 
        y = ticks, yend = ticks)) + 

    # labels 
    geom_text(data=lab_frame, aes(x=lab, y=zero, label=lab), 
      family = 'Times', vjust=1.5) + 
    geom_text(data=lab_frame, aes(x=zero, y=lab, label=lab), 
      family = 'Times', hjust=1.5) + 

    # THE DATA POINT 
    geom_point(color='navy', size=5) + 

    theme_void()