intl
intl

Reputation: 2773

Plot with a grid

I am looking for a type of plot that is essentially a grid. For example, there will be 10 columns and 50 rows. For example, something like this:

enter image description here

Each of the boxes (in this case, 10*50 = 500) will have a unique value that I will be providing via a data frame. Based on the unique values, I'll have a function that will assign a colour to each box. So then it becomes a grid to visualize "the range" of each box. I'd also need to label each of the columns (probably vertically so all labels fit) and rows (horizontally).

I just don't know what kind of plot that will be and I don't know if any libraries do this. I'm just looking for some help in finding something that does this. I'd appreciate some help if possible.

Upvotes: 3

Views: 3198

Answers (4)

SlowLearner
SlowLearner

Reputation: 7997

I would go to ggplot2 for this as it allows a high degree of flexibility. In particular geom_tile is useful. If you actually want the panel lines you can comment out the theme(panel.grid.major = element_blank()) + and theme(panel.grid.minor = element_blank()) + lines and of course you can specify the colours as well. The text in each cell is optional; comment out the geom_text call if you don't need that. Note that you can control the size of the plot (rows and columns) simply by resizing the plot window or - if you want to output to a file using png() - by specifying the width and height arguments.

library(ggplot2)
library(reshape)
library(scales)

set.seed(1234)
num.els <- 5
mydf <- data.frame(category1 = rep(LETTERS[1:num.els], 1, each = num.els),
                   category2 = rep(1:num.els, num.els),
                   value = runif(num.els^2, 0, 100))

p <- ggplot(mydf, aes(x = category1,
                      y = category2,
                      fill = value)) +
    geom_tile() +
    geom_text(label = round(mydf$value, 2), size = 4, colour = "black") +
    scale_fill_gradient2(low = "blue", high = "red",
                         limits = c(min(mydf$value), max(mydf$value)),
                         midpoint = median(mydf$value)) +
    scale_x_discrete(expand = c(0,0)) +
    scale_y_reverse() +
    theme(panel.grid.minor = element_blank()) +
    theme(panel.grid.major = element_blank()) +
    theme(axis.ticks = element_blank()) +
    theme(panel.background = element_rect(fill = "transparent"))+
    theme(legend.position = "none") +
    theme()

print(p)

Output:

screenshot

And resized:

screenshot

Upvotes: 4

Greg Snow
Greg Snow

Reputation: 49640

Look at the image function in the graphics package, or the rasterImage function if you want more control.

You could also build the plot up from scratch using the rect function.

Upvotes: 4

Sergio
Sergio

Reputation: 763

Lets say you have a dataframe with "x" and "y" coordinates per each cell of the grid, and a variable "z" for each cell, and you loaded this dataframe in R called "intlgrid":

head(intlgrid)

      x       y        z 

243.742 6783.367 0.0035285

244.242 6783.367 0.0037111

244.742 6783.367 0.0039073

"..."
"so on..."

With ggplot2 package you can easily plot your raster. So:

install.packages("ggplot2")

once installed ggplot2, you just call it

library(ggplot2)

Now the code:

ggplot(intlgrid, aes(x,y, fill = z)) + geom_raster() + coord_equal()

And then you get your grid plotted.

Upvotes: 2

Spacedman
Spacedman

Reputation: 94172

How about heatmap?

m=matrix(runif(12),3,4)
rownames(m)=c("Me","You","Him")
colnames(m)=c("We","Us","Them","I")
heatmap(m,NA,NA)

enter image description here

Note that it works on a matrix and not a data frame because all the values have to be numbers, and data frames are row-oriented records.

See the help for other options.

Upvotes: 6

Related Questions