Figure 5-29. Marginal rug with thinner, jittered lines
Solution
For annotating just one or a few points, you can use annotate() or geom_text(). For
this example, we’ll use the countries data set and visualize the relationship between
health expenditures and infant mortality rate per 1,000 live births. To keep things man‐
ageable, we’ll just take the subset of countries that spent more than $2000 USD per capita:
library(gcookbook) # For the data set
subset(countries, Year==2009 & healthexp>2000)
Name Code Year       GDP laborrate healthexp infmortality
Andorra  AND 2009        NA        NA  3089.636          3.1
Australia  AUS 2009  42130.82      65.2  3867.429          4.2
Austria  AUT 2009  45555.43      60.4  5037.311          3.6
...
United Kingdom  GBR 2009  35163.41      62.2  3285.050          4.7
United States  USA 2009  45744.56      65.0  7410.163          6.6
We’ll save the basic scatter plot object in sp and add then add things to it. To manually
add annotations, use annotate(), and specify the coordinates and label (Figure 5-30,
left). It may require some trial-and-error tweaking to get them positioned just right:
sp <- ggplot(subset(countries, Year==2009 & healthexp>2000),
aes(x=healthexp, y=infmortality)) +
5.11. Labeling Points in a Scatter Plot  |  105
Pdf find text - search text inside PDF file in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Learn how to search text in PDF document and obtain text content and location information
search text in pdf using java; pdf find text
Pdf find text - VB.NET PDF Text Search Library: search text inside PDF file in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
Learn How to Search Text in PDF Document and Obtain Text Content and Location Information in VB.NET application
select text pdf file; search a pdf file for text
Figure 5-30. Left: a scatter plot with manually labeled points; right: with automatically
labeled points and a smaller font
geom_point()
sp + annotate("text", x=4350, y=5.4, label="Canada") +
annotate("text", x=7400, y=6.8, label="USA")
To automatically add the labels from your data (Figure 5-30, right), use geom_text()
and map a column that is a factor or character vector to the label aesthetic. In this case,
we’ll use Name, and we’ll make the font slightly smaller to reduce crowding. The default
value for size is 5, which doesn’t correspond directly to a point size:
sp + geom_text(aes(label=Name), size=4)
Discussion
The automatic method for placing annotations centers each annotation on the x and y
coordinates. You’ll probably want to shift the text vertically, horizontally, or both.
Setting vjust=0  will make the  baseline  of  the  text  on  the same  level  as  the  point
(Figure 5-31, left), and setting vjust=1 will make the top of the text level with the point.
This usually isn’t enough, though—you can either increase or decrease vjust to shift
the labels higher or lower, or you can add or subtract a bit to or from the y mapping to
get the same effect (Figure 5-31, right):
sp + geom_text(aes(label=Name), size=4, vjust=0)
# Add a little extra to y
sp + geom_text(aes(y=infmortality+.1, label=Name), size=4, vjust=0)
106  |  Chapter 5: Scatter Plots
C# Word - Search and Find Text in Word
C# Word - Search and Find Text in Word. Learn How to Search Text in PDF Document and Obtain Text Content and Location Information. Overview.
pdf searchable text; search text in pdf image
C# PowerPoint - Search and Find Text in PowerPoint
C# PowerPoint - Search and Find Text in PowerPoint. Learn How to Search Text in PDF Document and Obtain Text Content and Location Information. Overview.
search pdf documents for text; find text in pdf files
Figure 5-31. Left: a scatter plot with vjust=0; right: with a little extra added to y
It often makes sense to right- or left-justify the labels relative to the points. To left-justify,
set hjust=0 (Figure 5-32, left), and to right-justify, set hjust=1. As was the case with
vjust, the labels will still slightly overlap with the points. This time, though, it’s not a
good idea to try to fix it by increasing or decreasing hjust. Doing so will shift the labels
a distance proportional to the length of the label, making longer labels move further
than shorter ones. It’s better to just set hjust to 0 or 1, and then add or subtract a bit to
or from x (Figure 5-32, right):
sp + geom_text(aes(label=Name), size=4, hjust=0)
sp + geom_text(aes(x=healthexp+100, label=Name), size=4, hjust=0)
If you are using a logarithmic axis, instead of adding to x or y, you’ll
need to multiply the x or y value by a number to shift the labels a
consistent amount.
If you want to label just some of the points but want the placement to be handled au‐
tomatically, you can add a new column to your data frame containing just the labels you
want. Here’s one way to do that: first we’ll make a copy of the data we’re using, then we’ll
duplicate the Name column into Name1:
cdat <- subset(countries, Year==2009 & healthexp>2000)
cdat$Name1 <- cdat$Name
5.11. Labeling Points in a Scatter Plot  |  107
C# Excel - Search and Find Text in Excel
Easy to search and find text content and get its location details. Allow to search defined Excel file page or the whole document. C# PDF: Example of Finding Text
can't select text in pdf file; pdf text search tool
VB.NET PDF File Merge Library: Merge, append PDF files in vb.net
When you have downloaded the RasterEdge Image SDK for .NET, you can unzip the package to find the RasterEdge.Imaging.PDF.dll in the bin folder under the root
text searchable pdf; find text in pdf image
Figure 5-32. Left: a scatter plot with hjust=0; right: with a little extra added to x
Next, we’ll use the %in% operator to find where each name that we want to keep is. This
returns a logical vector indicating which entries in the first vector, cdat$Name1, are
present in the second vector, in which we specify the names of the countries we want to
show:
idx <- cdat$Name1 %in% c("Canada""Ireland", "United Kingdom""United States",
"New Zealand""Iceland", "Japan""Luxembourg",
"Netherlands""Switzerland")
idx
[1] FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE
[13] FALSE  TRUE  TRUE FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
[25]  TRUE  TRUE  TRUE
Then we’ll use that Boolean vector to overwrite all the other entries in Name1 with NA:
cdat$Name1[!idx] <- NA
This is what the result looks like:
cdat
Name Code Year    GDP laborrate healthexp infmortality          Name1
Andorra  AND 2009     NA        NA  3089.636          3.1           <NA>
Australia  AUS 2009  42130      65.2  3867.429          4.2           <NA>
...
Switzerland  CHE 2009  63524      66.9  7140.729          4.1    Switzerland
United Kingdom  GBR 2009  35163      62.2  3285.050          4.7 United Kingdom
United States  USA 2009  45744      65.0  7410.163          6.6  United States
108  |  Chapter 5: Scatter Plots
C# HTML5 Viewer: Load, View, Convert, Annotate and Edit Excel
HTML5 Viewer for C# .NET, users can convert Excel to PDF document, export C#.NET RasterEdge HTML5 Viewer also enable users to quickly find text content by
convert pdf to word searchable text; convert pdf to searchable text online
VB.NET PDF File & Page Process Library SDK for vb.net, ASP.NET
document. If you find certain page in your PDF document is unnecessary, you may want to delete this page directly. Moreover, when
how to select all text in pdf; find and replace text in pdf file
Now we can make the plot (Figure 5-33). This time, we’ll also expand the x range so that
the text will fit:
ggplot(cdat, aes(x=healthexp, y=infmortality)) +
geom_point() +
geom_text(aes(x=healthexp+100, label=Name1), size=4, hjust=0+
xlim(200010000)
Figure 5-33. Scatter plot with selected labels and expanded x range
If any individual position adjustments are needed, you have a couple of options. One
option is to copy the columns used for the x and y coordinates and modify the numbers
for the individual items to move the text around. Make sure to use the original numbers
for the coordinates of the points, of course! Another option is to save the output to a
vector format such as PDF or SVG (see Recipes 14.1 and 14.2), then edit it in a program
like Illustrator or Inkscape.
See Also
For more on controlling the appearance of the text, see Recipe 9.2.
5.11. Labeling Points in a Scatter Plot  |  109
C# WPF Viewer: Load, View, Convert, Annotate and Edit Excel
function will help users to freely convert Excel document to PDF, Tiff and Text search and select functionalities and manipulate help to find text contents on
how to select text in pdf; search pdf files for text programmatically
XDoc.Word for .NET, Support Processing Word document and Page in .
Able to view and edit Word rapidly. Convert. Convert Word to PDF. Convert Word to ODT. Text & Image Process. Search and find text in Word. Insert image to Word page
make pdf text searchable; searching pdf files for text
If you want to manually edit a PDF or SVG file, see Recipe 14.4.
5.12. Creating a Balloon Plot
Problem
You want to make a balloon plot, where the area of the dots is proportional to their
numerical value.
Solution
Use geom_point() with scale_size_area(). For this example, we’ll use a subset of the
countries data set:
library(gcookbook) # For the data set
cdat <- subset(countries, Year==2009 &
Name %in% c("Canada""Ireland", "United Kingdom""United States",
"New Zealand""Iceland", "Japan""Luxembourg",
"Netherlands""Switzerland"))
cdat
Name Code Year       GDP laborrate healthexp infmortality
Canada  CAN 2009  39599.04      67.8  4379.761          5.2
Iceland  ISL 2009  37972.24      77.5  3130.391          1.7
Ireland  IRL 2009  49737.93      63.6  4951.845          3.4
Japan  JPN 2009  39456.44      59.5  3321.466          2.4
Luxembourg  LUX 2009 106252.24      55.5  8182.855          2.2
Netherlands  NLD 2009  48068.35      66.1  5163.740          3.8
New Zealand  NZL 2009  29352.45      68.6  2633.625          4.9
Switzerland  CHE 2009  63524.65      66.9  7140.729          4.1
United Kingdom  GBR 2009  35163.41      62.2  3285.050          4.7
United States  USA 2009  45744.56      65.0  7410.163          6.6
If we just map GDP to size, the value of GDP gets mapped to the radius of the dots
(Figure 5-34, left), which is not what we want; a doubling of value results in a quadrupling
of area, and this will distort the interpretation of the data. We instead want to map it to
the area, and we can do this using scale_size_area() (Figure 5-34, right):
<- ggplot(cdat, aes(x=healthexp, y=infmortality, size=GDP)) +
geom_point(shape=21, colour="black", fill="cornsilk")
# GDP mapped to radius (default with scale_size_continuous)
p
# GDP mapped to area instead, and larger circles
+ scale_size_area(max_size=15)
110  |  Chapter 5: Scatter Plots
Figure 5-34. Left: balloon plot with value mapped to radius; right: with value mapped to
area
Discussion
The example here is a scatter plot, but that is not the only way to use balloon plots. It
may also be useful to use them to represent values on a grid, where the x- and y-axes
are categorical, as in Figure 5-35:
# Add up counts for male and female
hec <- HairEyeColor[,,"Male"] + HairEyeColor[,,"Female"]
# Convert to long format
library(reshape2)
hec <- melt(hec, value.name="count")
ggplot(hec, aes(x=Eye, y=Hair)) +
geom_point(aes(size=count), shape=21, colour="black", fill="cornsilk") +
scale_size_area(max_size=20, guide=FALSE) +
geom_text(aes(y=as.numeric(Hair)-sqrt(count)/22, label=count), vjust=1,
colour="grey60", size=4)
In this example we’ve used a few tricks to add the text labels under the circles. First, we
used vjust=1 to top-justify the text to the y coordinate. Next, we wanted to set the y
coordinate so that it is just underneath the bottom of each circle. This requires a little
arithmetic: take the numeric value of Hair and subtract a small value from it, where the
value depends in some way on count. This actually requires taking the square root of
count, since the radius has a linear relationship with the square root of count. The
number that this value divided by (22 in this case) is found by trial and error; it depends
on the particular data values, radius, and text size.
The text under the circles is in a shade of grey. This is so that it doesn’t jump out at the
viewer and overwhelm the perceptual impact of the circles, but is still available if the
viewer wants to know the exact values.
5.12. Creating a Balloon Plot  |  111
Figure 5-35. Balloon plot with categorical axes and text labels
See Also
To add labels to the circles, see Recipes 5.11 and 7.1.
See Recipe 5.4 for ways of mapping variables to other aesthetics in a scatter plot.
5.13. Making a Scatter Plot Matrix
Problem
You want to make a scatter plot matrix.
Solution
A scatter plot matrix is an excellent way of visualizing the pairwise relationships among
several variables. To make one, use the pairs() function from R’s base graphics.
For this example, we’ll use a subset of the countries data set. We’ll pull out the data for
the year 2009, and keep only the columns that are relevant:
library(gcookbook) # For the data set
c2009 <- subset(countries, Year==2009,
select=c(Name, GDP, laborrate, healthexp, infmortality))
112  |  Chapter 5: Scatter Plots
c2009
Name        GDP laborrate  healthexp infmortality
Afghanistan          NA      59.8   50.88597        103.2
Albania   3772.6047      59.5  264.60406         17.2
Algeria   4022.1989      58.5  267.94653         32.0
...
Zambia   1006.3882      69.2   47.05637         71.5
Zimbabwe    467.8534      66.8         NA         52.2
To make the scatter plot matrix (Figure 5-36), we’ll use columns 2 through 5—using the
Name column wouldn’t make sense, and it would produce strange-looking results:
pairs(c2009[,2:5])
Figure 5-36. A scatter plot matrix
Discussion
We didn’t use ggplot2 here because it doesn’t make scatter plot matrices (at least, not
well).
5.13. Making a Scatter Plot Matrix  |  113
You can also use customized functions for the panels. To show the correlation coefficient
of each pair of variables instead of a scatter plot, we’ll define the function panel.cor.
This will also show higher correlations in a larger font. Don’t worry about the details
for now—just paste this code into your R session or script:
panel.cor <- function(x, y, digits=2, prefix="", cex.cor, ...) {
usr <- par("usr")
on.exit(par(usr))
par(usr = c(0, 101))
<- abs(cor(x, y, use="complete.obs"))
txt <- format(c(r, 0.123456789), digits=digits)[1]
txt <- paste(prefix, txt, sep="")
if(missing(cex.cor)) cex.cor <- 0.8/strwidth(txt)
text(0.50.5, txt, cex =  cex.cor * (1 + r) / 2)
}
To show histograms of each variable along the diagonal, we’ll define panel.hist:
panel.hist <- function(x, ...) {
usr <- par("usr")
on.exit(par(usr))
par(usr = c(usr[1:2], 01.5) )
<- hist(x, plot = FALSE)
breaks <- h$breaks
nB <- length(breaks)
<- h$counts
<- y/max(y)
rect(breaks[-nB], 0, breaks[-1], y, col="white", ...)
}
Both of these panel functions are taken from the pairs help page, so if it’s more conve‐
nient, you can simply open that help page, then copy and paste. The last line of this
version of the panel.cor function is slightly modified, however, so that the changes in
font size aren’t as extreme as with the original.
Now that we’ve defined these functions we can use them for our scatter plot matrix, by
telling pairs() to use panel.cor for the upper panels and panel.hist for the diagonal
panels.
We’ll also throw in one more thing: panel.smooth for the lower panels, which makes a
scatter plot and adds a LOWESS smoothed line, as shown in Figure 5-37. (LOWESS is
slightly different from LOESS, which we saw in Recipe 5.6, but the differences aren’t
important for this sort of rough exploratory visualization):
pairs(c2009[,2:5], upper.panel = panel.cor,
diag.panel  = panel.hist,
lower.panel = panel.smooth)
114  |  Chapter 5: Scatter Plots
Documents you may be interested
Documents you may be interested