2013-07-09 2 views
28

Я могу построить график рассеяния и покрасить точки на основе одного критерия, то есть я могу покрасить все точки> = 3 как красные, а остальные - как черные. Я хотел бы, чтобы иметь возможность цветовых точек таким образом:R цвет точек разброса точек на основе значений

  1. = 3 красный цвет

  2. < = 1 цвет синий
  3. Остальное как черный

Код, который у меня ниже, завершает шаги 1 и 3, но я не уверен, как включить второй аргумент шага 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)) 

Любая помощь будет большой !!! Заранее спасибо

enter image description here

ответ

40

Лучшая вещь, чтобы сделать здесь, чтобы добавить столбец объекта данных для представления цвета точки. Затем обновите его разделы путем фильтрации.

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

Должно быть понятно, как приспособить это для участков с большим количеством цветов & условий.

+0

работает как очарование! – Jcrow06

+10

'cut' было бы лучше для создания нового столбца, т. Е.' Data $ Color <- cut (данные $ col_name2, breaks = c (-Inf, 1, 3, Inf), labels = c ("blue", "black "," красный ")). Держит его в одной строке, и даже более легко обобщаемый – Gregor

+0

Это здорово, я не знал о разрезе! – CnrL

14

Кроме того, было бы работать, чтобы просто указать ifelse() дважды:

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

Оба ansers великолепны! Я не могу даже обвинять его в понедельнике за то, что я пропустил вложенный ifelse. – Jcrow06

+0

Мне это нравится, очень элегантно. Все, что я могу сказать в защиту моей альтернативы, состоит в том, что она будет более четко масштабироваться для проблем, требующих большего количества цветов. – CnrL

2

Это лучше создать новый переменный фактор, используя разрез(). Я добавил несколько вариантов, используя 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

с использованием «с», базовый подход не работает: df <- data.frame (X1 = seq (0, 5, by = 0.001)) df $ X2 <- rnorm (df $ X1, mean = 3.5, sd = 1.5) df $ Цвет <- "medium" df $ Цвет [df $ X2> = 3] = "высокий" df $ Цвет [df $ X2 <= 1] = "низкий" с (df, plot (X2 , xlab = "X2", ylab = "number"), , ylim = c (20,75), pch = 21, cex = 1.4, col = Цвет) –

+0

Это работает, вы просто сделали синтаксическую ошибку в ваш вызов 'plot()'. Я отредактировал ответ и добавил вашу версию. – marbel