Определите цвет для каждой точки данных на ленточной диаграмме отдельно

Я хотел бы определить цвет каждой точки данных на ленточной диаграмме отдельно, чтобы добавить дополнительный информационный слой на ленточную диаграмму. я не нашел решения

Я знаю о разной окраске групп на графике R и ответ предполагает, что это невозможно для каждой точки данных. Я прав?

Способ обойти это может состоять в том, чтобы построить столбец за столбцом в цикле for, но тогда x-позиции перепутались

d = c (1,3,4);
e = c (2,3,4)
f = c (2,6,5)
data = list (d, e, f)
stripchart (data, vertical =T, pch =21, bg = 1, col=2)

Допустим, я хотел бы покрасить простые числа в красный цвет, не простые числа в синий. Или четные и нечетные.

Самое универсальное решение — использовать список цветов того же размера, что и входные данные, где каждое значение определяет цвет соответствующей отображаемой точки данных.


person bud.dugong    schedule 28.09.2015    source источник


Ответы (3)


При использовании ленточной диаграммы для нескольких групп, используя интерфейс формул, вы можете просто добавить дополнительную ленточную диаграмму к существующему графику. Однако это не поможет, если вы используете джиттер.

mydata <- data.frame (x = rnorm(30), group = gl(3, 10, labels = letters[1:3]))
stripchart(x ~ group, data = mydata)
makered <- mydata$group == "b" & mydata$x < 1
stripchart(x ~ group, data = mydata[makered, ], col = "red", add = TRUE)
person Ute    schedule 02.04.2019

Вот решение, которое вы можете использовать для подобных проблем. Короче говоря, вы строите ленточную диаграмму, преобразуете график в гроб с помощью пакета gridGraphics, затем изменяете графические примитивы, просто редактируя гроб.

library(gridGraphics)
grid.newpage()

# Get some data
sample(x = 1:100, size = 50) -> data

# Grab plot...Now it's a grob you can modify
stripchart (data, vertical =T, pch =21, bg = 1, col=2)
grid.echo()
grid.grab() -> mygrob

# Pull out the values of the data and strip unit class
mygrob$children$`graphics-plot-1-points-1`$y -> myunits
convertUnit(myunits, "native", valueOnly = TRUE) -> myunits

# Some data to reference ours against...You can use a test for if your data is a prime, equal number, odd number, whatever..I'm just going to test if my data is in this vector and specify the color based on the results from this test.
sample(1:100, size = 10) -> sampleVec
ifelse(myunits %in% sampleVec, "red", "green") -> updatedCols

# Now sub in the new color specs for the points
mygrob$children$`graphics-plot-1-points-1`$gp$col <- updatedCols
mygrob$children$`graphics-plot-1-points-1`$gp$fill <- updatedCols

# ...And plot
grid.draw(mygrob) 

введите здесь описание изображения

person Chris    schedule 28.09.2015
comment
Спасибо @Chris, это слишком длинно, но приятно знать, что это можно сделать! - person bud.dugong; 06.10.2015

Тогда еще проще начертить их 1 на 1 и использовать параметр bg=:

# generate fake data
datalist = list( rnorm(100), rnorm(100, sd = 1),rnorm(100, sd = 2) )
# generate color value for each data point  (say I want to color by each values sign +/-)
colorlist = lapply(datalist, sign)
plot(0,0,type="n",xlim=c(0.5,3.5), ylim=c(-10,10),  xaxt = 'n', xlab ="", ylab = "value",  main ="Smear")
for (i in 1:3) { stripchart(na.omit(datalist[[i]]), at = i, add = T, bg = colorlist[[i]]+2, vertical = T, pch =21, method = "jitter") }
axis(side=1,at=1:3,labels=3:1)
person bud.dugong    schedule 06.10.2015