2013-07-19 18 views
10

C'è un modo per ottenere gli assi, con le etichette al centro di un grafico ggplot2, come una calcolatrice grafica tradizionale? Ho esaminato i documenti e non sembra esserci quella funzionalità, ma altri pacchetti di plottaggio non sono graficamente personalizzabili come ggplot2. Per chiarire, stavo cercando di passare da qualcosa di simile a questo:Asse centrale xey con ggplot2

ggplot

A tal:

mathematica

Il primo lotto è realizzato con il seguente codice:

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) 

La seconda trama è realizzata con Mathematica. Il problema principale che sto avendo è capire come creare l'asse, con le etichette, andare al centro (posso rendere il tema vuoto, ecc., Nessun problema). Sembra che non ci sia alcun parametro di tema che puoi modificare per rendere questa una soluzione rapida.

+1

può fornire un'immagine che mostra l'output desiderato? – ialm

+0

@ialm Ho aggiunto alcuni chiarimenti – user2407894

+0

Sono quasi sicuro che non ci sia, ma non riesco a trovare una fonte che dichiari definitivamente che non è possibile. –

risposta

1

Vorrei utilizzare solo xlim e 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

È vero che questo è un modo per centrarlo. Ma non sembra esserci una "modalità" o anche un modo semplice per posizionare gli assi reali nel mezzo, come visto nella trama di Mathematica. – user2407894

+0

Beh, è ​​abbastanza semplice. Non è quello a cui sei abituato. Questa è R, non Mathematica. – SlowLearner

+0

Lo capisco.Non penso che tu abbia capito la domanda. – user2407894

1

Una prima approssimazione:

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

Regolare limiti di cui risposta di SlowLearner.

+0

Quindi, se volessi le etichette degli assi sulle linee, dovrei disegnarle? – user2407894

+0

@ user2407894: Sì, le linee sono linee semplici, senza etichette o segni di graduazione. – krlmlr

6

Penso che questo è quello che stai cercando:

enter image description here

ho costruito una funzione che fa proprio questo:

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) 
} 

A titolo di esempio è possibile eseguire il seguente codice per creare un'immagine simile alla precedente:

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

Ci sono alcune altre risposte utili, ma il seguente si avvicina al bersaglio visivo ed evita loop:

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() 
Problemi correlati