2013-07-09 13 views
28

Potrafię wykreślić wykres punktowy i pokolorować punkty na podstawie jednego kryterium, tj. Mogę pokolorować wszystkie punkty> = 3 jako czerwone, a pozostałe jako czarne. chciałbym móc punktów koloru w ten sposób:Punkty rozproszenia w kolorze R na podstawie wartości

  1. = 3 kolor czerwony

  2. < = 1 kolor niebieski
  3. Reszta jako czarne

Poniższy kod kończy etap 1 i 3, ale nie jestem pewien, jak włączyć drugi argument kroku 2

data<- read.table('sample_data.txtt', header=TRUE, row.name=1) 
pos<- data$col_name1 
cn<- data$col_name2 
plot(pos,cn, ylim=c(0,5), col="blue") 
plot(pos,cn, col=ifelse(cn>=3,"red","black"), ylim=c(0,10)) 

Każda pomoc będzie świetna !!! góry dzięki

enter image description here

Odpowiedz

40

najlepszą rzeczą do zrobienia jest, aby dodać kolumnę do obiektu danych do reprezentowania koloru punktu. Następnie zaktualizuj sekcje, filtrując.

data<- read.table('sample_data.txtt', header=TRUE, row.name=1) 
# Create new column filled with default colour 
data$Colour="black" 
# Set new column values to appropriate colours 
data$Colour[data$col_name2>=3]="red" 
data$Colour[data$col_name2<=1]="blue" 
# Plot all points at once, using newly generated colours 
plot(data$col_name1,data$col_name2, ylim=c(0,5), col=data$Colour, ylim=c(0,10)) 

To powinno być jasne, w jaki sposób dostosować to dla działek o więcej kolorów & warunkach.

+0

działa jak urok! – Jcrow06

+10

'cut' byłoby lepsze do tworzenia nowej kolumny, np.' Data $ Kolor <- cut (dane $ col_name2, breaks = c (-Inf, 1, 3, Inf), labels = c ("blue", "black" "," czerwony "))'. Przechowuje ją w jednym wierszu, a jeszcze łatwiej można ją uogólnić. – Gregor

+0

To świetnie, nie wiedziałem o cięciu! – CnrL

14

także, że to działa tylko określić ifelse() dwukrotnie:

plot(pos,cn, col= ifelse(cn >= 3, "red", ifelse(cn <= 1,"blue", "black")), ylim = c(0, 10)) 
+1

Obie wersje są świetne! Nie mogę nawet obwiniać tego w poniedziałek za brak zagnieżdżonego ifelse – Jcrow06

+0

Podoba mi się to, bardzo elegancko. Wszystko, co mogę powiedzieć w obronie mojej alternatywy, polega na tym, że będzie ona wyraźniej skalować problemy, w których wymagane są więcej kolorów. – CnrL

2

Lepiej utworzyć nową zmienną przy użyciu współczynnika cięcie(). Dodałem kilka opcji, używając również ggplot2.

df <- data.frame(
    X1=seq(0, 5, by=0.001), 
    X2=rnorm(df$X1, mean = 3.5, sd = 1.5) 
) 

# Create new variable for plotting 
df$Colour <- cut(df$X2, breaks = c(-Inf, 1, 3, +Inf), 
       labels = c("low", "medium", "high"), 
       right = FALSE) 

### Base Graphics 

plot(df$X1, df$X2, 
    col = df$Colour, ylim = c(0, 10), xlab = "POS", 
    ylab = "CS", main = "Plot Title", pch = 21) 

plot(df$X1,df$X2, 
    col = df$Colour, ylim = c(0, 10), xlab = "POS", 
    ylab = "CS", main = "Plot Title", pch = 19, cex = 0.5) 

# Using `with()` 

with(df, 
    plot(X1, X2, xlab="POS", ylab="CS", col = Colour, pch=21, cex=1.4) 
    ) 

# Using ggplot2 
library(ggplot2) 

# qplot() 
qplot(df$X1, df$X2, colour = df$Colour) 

# ggplot() 
p <- ggplot(df, aes(X1, X2, colour = Colour)) 
p <- p + geom_point() + xlab("POS") + ylab("CS") 
p 

p + facet_grid(Colour~., scales = "free") 
+0

przy użyciu "z", podejście podstawowe nie działa: df <- data.frame (X1 = seq (0, 5, przez = 0,001)) df $ X2 <- rnorm (df $ X1, średnia = 3,5, sd = 1.5) df $ Kolor <- "średni" df $ Kolor [df $ X2> = 3] = "wysoki" df $ Kolor [df $ X2 <= 1] = "niski" z (df, wykres (X2 , xlab = "X2", ylab = "liczba"), , ylim = c (20,75), pch = 21, cex = 1,4, col = Kolor) –

+0

Działa, po prostu popełniłeś błąd składniowy w twoje wywołanie 'plot()'. Edytowałem odpowiedź i dodałem twoją wersję. – marbel

Powiązane problemy