Reputation:
I have a factor and a numeric vector. When I plot these using
plot(factor ~ vector, data)
it looks like this:
but I want it to look like this:
with the y-axis representing (cumulative) frequencies.
Problem is, when I tell R to plot using lines, R tells me
In rect(xleft, ybottom, xright, ytop, col = col, ...) :
graphical parameter "type" is obsolete
So how do I do this?
Extra points for solutions with base plot() instead of ggplot or somesuch. Colors not necessary, can be grey values.
Sample data:
a.factor <- c("level1", "level1", "level1", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level1", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level1", "level2", "level1", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level1", "level1", "level1", "level1", "level2", "level1", "level1", "level2", "level1", "level1", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level1", "level1", "level2", "level1", "level1", "level1", "level1", "level1", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level1", "level2", "level2", "level2", "level2", "level1", "level1", "level2", "level1", "level2", "level2", "level2", "level2", "level2", "level1", "level2", "level2", "level1", "level2", "level2", "level1", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level1", "level2", "level1", "level2", "level2", "level2", "level1", "level1", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level1", "level2", "level2", "level2", "level2", "level1", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level1", "level3", "level1", "level1", "level1", "level3", "level2", "level1", "level2", "level2", "level1", "level1", "level2", "level2", "level2", "level2", "level2", "level2", "level1", "level1", "level1", "level1", "level1", "level1", "level2", "level1", "level1", "level1", "level1", "level1", "level1", "level1", "level1", "level1", "level1", "level1", "level1", "level1", "level1", "level1", "level2", "level1", "level1", "level1", "level1", "level1", "level1", "level1", "level1", "level2", "level2", "level2", "level1", "level2", "level2", "level2", "level2", "level1", "level2", "level2", "level1", "level1")
b.vector <- c(314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 318, 318, 318, 318, 318, 318, 318, 319, 319, 319, 319, 319, 320, 320, 320, 320, 320, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321)
dat <- data.frame(a.factor, b.vector)
plot(a.factor ~ b.vector, dat)
Upvotes: 3
Views: 470
Reputation: 13139
Here is a solution using ggplot and geom_area. In order to correctly force the stacking for combinations that weren't present in the data, some aggregating was required.
library(ggplot2)
library(data.table)
setDT(dat)
dat_agg <-as.data.table(table(dat)) #thanks @Maju116; sometimes I do things too complicated.
#plot
p1 <- ggplot(dat_agg,
aes(x = b.vector, y = N,group = a.factor)) +
geom_area(aes(fill = a.factor), position = "stack")
p1
dat <- data.frame(a.factor, b.vector)
Data needs to be turned to a series of x and y coordinates for plotting the polygons. They need to be in the proper order ('lower' range with increasing x and 'upper' range with decreasing x in this example).
#calculate 'upper range' of each polygon
#using cumsum as they're stacked
max_points <- apply(table(dat),MARGIN=2,cumsum)
#lower range for first level is 0, for other levels
#lower range is upper range of level below it.
min_points <- rbind(0, max_points[1:2,ncol(max_points):1]) #reverse order
rownames(min_points) <- rownames(max_points)
#combine
polydata <- cbind(max_points,min_points)
#x position
x_vector <- as.numeric(colnames(polydata))
#colors
mycols <- c("red","blue","green")
#plotting (empty plot first, then add polygons)
plot(x=b.vector, y=seq(0,100,length.out=length(b.vector)),type="n",
ylab="frequency")
lapply(1:nrow(polydata),function(i){
polygon(x=x_vector, y=as.numeric(polydata[i,]),col=mycols[i])
})
legend(x=320, y=100, legend=rownames(polydata),fill=mycols)
Upvotes: 3
Reputation: 1607
Do you want something like this?
dane<-data.frame(a.factor,b.vector)
dane<-as.data.frame(table(dane))
library(ggplot2)
ggplot(dane,aes(group=a.factor,x=b.vector,y=Freq,color=a.factor))+geom_point()+geom_line()
Upvotes: 0