Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

plot an item map (based on difficulties)

Tags:

r

I have a data set of item difficulties that correspond to items on a questionnaire that looks like this:

##         item  difficulty
## 1  ITEM_01_A  2.31179818
## 2  ITEM_02_B  1.95215238
## 3  ITEM_03_C  1.93479536
## 4  ITEM_04_D  1.62610855
## 5  ITEM_05_E  1.62188759
## 6  ITEM_06_F  1.45137544
## 7  ITEM_07_G  0.94255210
## 8  ITEM_08_H  0.89941812
## 9  ITEM_09_I  0.72752197
## 10 ITEM_10_J  0.61792597
## 11 ITEM_11_K  0.61288399
## 12 ITEM_12_L  0.39947791
## 13 ITEM_13_M  0.32209970
## 14 ITEM_14_N  0.31707701
## 15 ITEM_15_O  0.20902108
## 16 ITEM_16_P  0.19923607
## 17 ITEM_17_Q  0.06023317
## 18 ITEM_18_R -0.31155481
## 19 ITEM_19_S -0.67777282
## 20 ITEM_20_T -1.15013758

I want to make an item map of these items that looks similar (not exactly) to this (I created this in word but it lacks true scaling as I just eyeballed the scale). It's not really a traditional statistical graphic and so I don't really know how to approach this. I don't care what graphics system this is done in but I am more familiar with ggplot2 and base.

I would greatly appreciate a method of plotting this sort of unusual plot.

Here's the data set (I'm including it as I was having difficulty using read.table on the dataframe above):

DF <- structure(list(item = c("ITEM_01_A", "ITEM_02_B", "ITEM_03_C", 
    "ITEM_04_D", "ITEM_05_E", "ITEM_06_F", "ITEM_07_G", "ITEM_08_H", 
    "ITEM_09_I", "ITEM_10_J", "ITEM_11_K", "ITEM_12_L", "ITEM_13_M", 
    "ITEM_14_N", "ITEM_15_O", "ITEM_16_P", "ITEM_17_Q", "ITEM_18_R", 
    "ITEM_19_S", "ITEM_20_T"), difficulty = c(2.31179818110545, 1.95215237740899, 
    1.93479536058926, 1.62610855327073, 1.62188759115818, 1.45137543733965, 
    0.942552101641177, 0.899418119889782, 0.7275219669431, 0.617925967008653, 
    0.612883990709181, 0.399477905189577, 0.322099696946661, 0.31707700560997, 
    0.209021078266059, 0.199236065264793, 0.0602331732900628, -0.311554806052955, 
    -0.677772822413495, -1.15013757942119)), .Names = c("item", "difficulty"
    ), row.names = c(NA, -20L), class = "data.frame")

Thank you in advance.

like image 607
Tyler Rinker Avatar asked May 10 '26 08:05

Tyler Rinker


1 Answers

Here is a quick example:

ggplot(DF, aes(x=1, y=difficulty, label = item)) + 
  geom_text(size = 3) + 
  scale_y_continuous(breaks = DF$difficulty, minor_breaks = NULL, labels = sprintf("%.02f", DF$difficulty)) +
  scale_x_continuous(breaks = NULL) +
  opts(panel.grid.major = theme_blank())

but sometimes two items are too narrow so overlapped. You may do like this:

m <- 0.1
nd <- diff(rev(DF$difficulty))
nd <- c(0, cumsum(ifelse(nd < m, m, nd)))
DF$nd <- rev(rev(DF$difficulty)[1] + nd)

ggplot(DF, aes(x=1, y=nd, label = item)) + 
  geom_text(size = 3) + 
  scale_y_continuous(breaks = DF$nd, labels = sprintf("%.02f", DF$difficulty), DF$difficulty, minor_breaks = NULL) +
  scale_x_continuous(breaks = NULL) +
  opts(panel.grid.major = theme_blank())
like image 55
kohske Avatar answered May 12 '26 03:05

kohske