具有多个Y刻度的XY图

时间:2012-03-09 00:45:50

标签: r plot

这可能不重复,因为我没有要求如何在同一个地块中绘制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只有解决方案。

谢谢

2 个答案:

答案 0 :(得分:4)

根据我的理解,您希望yy2完全对应(根据比例)?

在这种情况下,您可以绘制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)

enter image description here

答案 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();

} }