user1322720
user1322720

Reputation:

Plot factor as line or area instead of rectangle

I have a factor and a numeric vector. When I plot these using

plot(factor ~ vector, data)

it looks like this:

enter image description here

but I want it to look like this:

enter image description here

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

Answers (2)

Heroka
Heroka

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

enter image description here

Edit: using base-R only (nice challenge)

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)

enter image description here

Upvotes: 3

Maju116
Maju116

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

https://i.sstatic.net/rtj1Z.png

Upvotes: 0

Related Questions