R lattice 使用 xyplot 正确标记点
R lattice correctly labelling points with xyplot
library(lattice)
# load reproducible data set
attach(mtcars)
# change the rownames into a column value and remove the rownames
mtcars <- as.data.frame(cbind(car.name=rownames(mtcars), mtcars))
rownames(mtcars) <- NULL
# panel function parameters so that I label the points that are 100 units
# different between the hp and disp values and label the points with the car name
panel = function (x, y, ...) {
panel.xyplot(x, y, ...)
x1 <- x[x-y > 100 | y-x > 100]
y1 <- y[x-y > 100 | y-x > 100]
panel.text(x1, y1, labels=mtcars$car.name, pos=3)
}
#calling the xyplot
xyplot(hp~disp, data=mtcars, main=NULL, ylab="hp", xlab="disp",
jitter=TRUE, pch=1, as.table=TRUE, panel=panel)
我可以看到 hp
和 disp
之间显示 100 个单位差异的所有点都有一个标签。
但是,标签与 table 中的实际数据不匹配。
我可以通过首先按 disp
列按降序对 mtcars
进行排序来说明这一点:
mtcars <- mtcars[order(-mtcars$disp),]
head(mtcars)
car.name mpg cyl disp hp drat wt qsec vs am gear carb
15 Cadillac Fleetwood 10.4 8 472 205 2.93 5.250 17.98 0 0 3 4
16 Lincoln Continental 10.4 8 460 215 3.00 5.424 17.82 0 0 3 4
17 Chrysler Imperial 14.7 8 440 230 3.23 5.345 17.42 0 0 3 4
25 Pontiac Firebird 19.2 8 400 175 3.08 3.845 17.05 0 0 3 2
5 Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
7 Duster 360 14.3 8 360 245 3.21 3.570 15.84 0 0 3 4
如您所见,car.name
最高disp
的是凯迪拉克弗利特伍德,图中没有标注,实际上出现了另一个车名。
如何根据我的条件显示正确的汽车名称,即只标记 disp
和 hp
之间的单位差异 >100 的汽车?我的面板功能有问题。
x1
、y1
和mtcars$carname
长度不同,因此标签不对应:
length(x1)=11
length(y1)=11,
length(mtcars$carname)=32
这是修改后的版本:
panel = function (x, y, ...) {
panel.xyplot(x, y, ...)
v <- abs(x - y) > 100
panel.text(x[v], y[v], labels=mtcars$car.name[v], pos=3)
}
xyplot(hp~disp, data=mtcars, main=NULL, ylab="hp", xlab="disp",
jitter=TRUE, pch=1, as.table=TRUE, panel=panel)
library(lattice)
# load reproducible data set
attach(mtcars)
# change the rownames into a column value and remove the rownames
mtcars <- as.data.frame(cbind(car.name=rownames(mtcars), mtcars))
rownames(mtcars) <- NULL
# panel function parameters so that I label the points that are 100 units
# different between the hp and disp values and label the points with the car name
panel = function (x, y, ...) {
panel.xyplot(x, y, ...)
x1 <- x[x-y > 100 | y-x > 100]
y1 <- y[x-y > 100 | y-x > 100]
panel.text(x1, y1, labels=mtcars$car.name, pos=3)
}
#calling the xyplot
xyplot(hp~disp, data=mtcars, main=NULL, ylab="hp", xlab="disp",
jitter=TRUE, pch=1, as.table=TRUE, panel=panel)
我可以看到 hp
和 disp
之间显示 100 个单位差异的所有点都有一个标签。
但是,标签与 table 中的实际数据不匹配。
我可以通过首先按 disp
列按降序对 mtcars
进行排序来说明这一点:
mtcars <- mtcars[order(-mtcars$disp),]
head(mtcars)
car.name mpg cyl disp hp drat wt qsec vs am gear carb
15 Cadillac Fleetwood 10.4 8 472 205 2.93 5.250 17.98 0 0 3 4
16 Lincoln Continental 10.4 8 460 215 3.00 5.424 17.82 0 0 3 4
17 Chrysler Imperial 14.7 8 440 230 3.23 5.345 17.42 0 0 3 4
25 Pontiac Firebird 19.2 8 400 175 3.08 3.845 17.05 0 0 3 2
5 Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
7 Duster 360 14.3 8 360 245 3.21 3.570 15.84 0 0 3 4
如您所见,car.name
最高disp
的是凯迪拉克弗利特伍德,图中没有标注,实际上出现了另一个车名。
如何根据我的条件显示正确的汽车名称,即只标记 disp
和 hp
之间的单位差异 >100 的汽车?我的面板功能有问题。
x1
、y1
和mtcars$carname
长度不同,因此标签不对应:
length(x1)=11
length(y1)=11,
length(mtcars$carname)=32
这是修改后的版本:
panel = function (x, y, ...) {
panel.xyplot(x, y, ...)
v <- abs(x - y) > 100
panel.text(x[v], y[v], labels=mtcars$car.name[v], pos=3)
}
xyplot(hp~disp, data=mtcars, main=NULL, ylab="hp", xlab="disp",
jitter=TRUE, pch=1, as.table=TRUE, panel=panel)