这可能不重复,因为我没有要求如何在同一个地块中绘制2个系列,而是如何在一个XY系列上添加2个(互连的)y刻度
这是框架
t <- data.frame(x=seq(0,1,0.01), y=exp(seq(0,1,0.01))*500, y2=exp(seq(0,1,0.01))*30)
head(t)
x y y2
1 0.00 500.0000 30.00000
2 0.01 505.0251 30.30151
3 0.02 510.1007 30.60604
4 0.03 515.2273 30.91364
5 0.04 520.4054 31.22432
6 0.05 525.6355 31.53813
y和y2线性互连。我想构建一个带有x,y(左侧,侧面2)和y2(右侧,侧面4)的图,以便绘图上的每个点都有一个x和2 y坐标。
基础R只有解决方案。
谢谢
答案 0 :(得分:4)
根据我的理解,您希望y
和y2
完全对应(根据比例)?
在这种情况下,您可以绘制y对x,它在左侧绘制一个轴,然后在右侧绘制一个相同的轴,除了,您可以更改标签。< / p>
在基础图形中:
# do first plot. Don't draw axis (we'll do it later)
plot(y~x,data=t,axes=F,ylab='y')
# draw y axis (see ?axis, 1=bottom, 2=left, 3=top, 4=right)
axis(2,pretty(range(t$y)))
# tell R to draw over the first plot
par(new=T)
# do second plot.
plot(y2~x,data=t,axes=F,ylab="")
# draw second axis on the right
axis(4,pretty(range(t$y2)),ylab='y2')
# draw x axis on the bottom
axis(1,pretty(range(t$x)))
# draw the box if you want
box()
这是如何运作的:
1)绘制y vs x。不绘制轴,因为:
2)我们在轴上画画。 axis(2,pretty(range(t$y)))
。 pretty
取一个起点和终点,并生成合适的轴刻度标记(通常为5或10的倍数)
3)par(new=T)
:我们告诉R,它的下一个绘图应该绘制在当前的顶部 - 不要擦掉我们到目前为止绘制的内容!
4)我们绘制y2
vs x
。这会将坐标系重置为y2
坐标系。
5)我们绘制右手轴。这是有效的,因为我们刚刚绘制了y2
vs x
,因此坐标系适用于y2
(而不是我们第一次开始绘图时的y
)。
6)在x轴上绘制
7)在情节周围绘制框(如果你愿意)。
您可能会注意到情节是偏斜的 - 在情节的左侧和情节之间有更多的空白区域。图形设备的边缘比右边的边缘。那是因为R想要为通常在左边绘制的y标签留出空间。
如果您想要均衡,请使用par(mar=c(top,left,bottom,right))
。
查看?par
,我们看到默认值为c(5,4,4,2)+.1
。
因此,请将此代码段添加到代码的前面:
# get the current margins (top, left, bottom, right)
m <- par('mar')
# make sure the right margin is the same as the left.
m[4]<-m[2]
# set the new margins
par(mar=m)
# .... perform plotting as above.
现在你可以看到情节两侧的空间相等,所以ti不再看起来不平衡了。但是,您可能还注意到左侧轴上有y标签,但右侧没有。
这有点难看 - 我们必须使用mtext
手动添加它(在图上绘制文字):
mtext('y2',4,line=2)
'y2'
是y轴标签,4表示“在图的右侧绘制”,line=2
表示“在第2行绘制标签,从0开始轴向外计数“。
# margin
m <- par('mar')
m[4] <- m[2]
par(mar=m)
# plotting
plot(y~x,data=t,axes=F,ylab='y')
axis(2,pretty(range(t$y)))
par(new=T)
plot(y2~x,data=t,axes=F,ylab="")
axis(4,pretty(range(t$y2)),ylab='y2')
axis(1,pretty(range(t$x)))
box()
# right-hand ylabel
mtext('y2',4,line=2)
答案 1 :(得分:0)
第2部分
final ArrayList<Integer> posArrX = new ArrayList<Integer>();
final ArrayList<Integer> posX = new ArrayList<Integer>();
final ArrayList<Integer> posArrY = new ArrayList<Integer>();
final ArrayList<Integer> posY = new ArrayList<Integer>();
final Display display = new Display();
final Shell shell = new Shell(display);
shell.setSize(467, 264);
//shell.setSize(xf, yf);
shell.setLayout(new FillLayout());
// Create a canvas
Canvas canvas = new Canvas(shell, SWT.NONE);
canvas.addPaintListener(new PaintListener() {
@Override
public void paintControl(PaintEvent e) {
Canvas canvas = (Canvas) e.widget;
int maxX = canvas.getSize().x - 50;
int maxY = canvas.getSize().y - 20;
e.gc.setForeground(e.display.getSystemColor(SWT.COLOR_BLUE));
int h = 0;
int pixelCount = 3;
e.gc.drawLine(50, maxY, maxX + 50, maxY);
e.gc.drawLine(50, maxY, 50, 0 + 0);
e.gc.drawLine(50, maxY, convertXY(maxX), maxY - maxX);
// System.out.println(maxY);
// maxX = 1580;
// suppose x = 400, y = 300 -- > 400 / 14 = .. X
int maxLength = maxX;
int maxWidth = maxY;
int pointsOfX[] = {80, 150, 90, 100, 190, 170};
int pointsOfY[] = {40, 120, 40, 80, 150, 140};
// Arrays.sort(pointsOfX);
// int maxLength = pointsOfX[3];
int incX = maxLength / 5;
int incY = maxWidth / 5;
int px = 50;
int py = 30;
py = maxY - py;
int counterx = 0;
int x = 0;
int y = 0;
for (int i = 0; i <= maxX;) {
x = x + 50;
i = i + incX;
e.gc.drawLine(50 + i, maxY, 50 + i, 0);
e.gc.drawString("" + x, 30 + i, maxY + 3);
// e.gc.drawString("80", 170, maxY - 20);
posArrX.add(x);
posX.add(50 + i);
}
// e.gc.drawString("" + x + 50, maxX - 10, maxY + 3);
int countery = 0;
for (int i = 10; i < maxY - 20;) {
y = y + 50;
i = i + incY;
e.gc.drawLine(50, maxY - i, maxX + 50, maxY - i);
e.gc.drawString("" + y, 30, (maxY - i) + 10);
countery++;
posArrY.add(y);
posY.add(maxY - i);
}
System.out.println(posArrX.get(0) + " hier xxxxx" + posX.get(0));
//int pointsOfX[] = { 100, 200, 50, 150 };
//int pointsOfY[] = { 80, 150, 250, 179 };
for (int i = 0; i < pointsOfX.length; i++) {
for (int j = 0; j < posArrX.size(); j++) {
if (pointsOfX[i] <= posArrX.get(j)) {
System.out.println(posX.get(j) + "hier = "
+ posArrX.get(j));
for (int k = 0; k < posArrY.size(); k++) {
if (pointsOfY[i] < posArrY.get(k)) {
for (int L = 0; L < pixelCount; L++) {
for (int M = 0; M < pixelCount; M++) {
e.gc.drawPoint((posX.get(j) - 10)
+ M, (posY.get(k) + 10) + L);
// e.gc.drawPoint(px + j, py + i);
}
}
break;
}
}
break;
}
}
}
e.gc.drawLine(50, maxY, convertXY(maxX), maxY - maxX);
posArrX.clear();
posX.clear();
posArrY.clear();
posY.clear();
}
});
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
} }