(4) - 谈谈gnuplot(十四):第二坐标轴


http://blog.sciencenet.cn/blog-373392-501454.html


回首看看我们以前所有的作图,横坐标都标示在底部,而纵坐标都标示在左侧。其实,在图像顶部和右侧,还隐藏着一对不太引人注意的坐标轴,我们可以管它们叫做“第二坐标轴”。平时,它们只是第一对坐标轴的镜像;在我们需要的时候,它们可以用来表示不同的物理量。有时候,我们会有两组性质不同但是又相互关联的数据,这时候我们或许想把他们画在同一副图上,以便比较。

还拿北京市月平均降水量举例,但是这次,我们把温度也加上。下面是我们的数据文件 weather_beijing.dat

### 文件开始 ###
# 北京月平均降水量(毫米)及气温(摄氏度)
#
# 月份  降水量  气温
# ===================
1       2.5     -4
2       5.1     -2
3       10.2    6
4       25.4    13
5       27.9    20
6       71.1    24
7       175.3   26
8       182.9   25
9       48.3    20
10      17.8    13
11      5.1     5
12      2.5     -2
### 文件结束 ###


我们之前讲过的所有有关坐标的参数,在第二坐标轴上均适用,只不过相应的名字起始字母改为 x2 或者 y2,例如 ylabel 改为 y2label。另外,plot 命令有一个新的参数 axis,用来控制使用哪个坐标轴,例如 axis x1y2 就表示使用第一横轴和第二纵轴。现在我们来看用上面数据作图的例子:

gnuplot> set xlabel "月份"
gnuplot> set ylabel "降水量(毫米)"
gnuplot> set y2label "气温(摄氏度)"
gnuplot> set title "北京市月平均降水量及气温"
gnuplot> set xrange [0.5:12.5]
gnuplot> set xtics 1,1,12
gnuplot> plot "weather_beijing.dat" u 1:2 w lp pt 5 lc rgbcolor "#2B60DE" axis x1y1 t "降水量", "weather_beijing.dat" u 1:3 w lp pt 7 lc rgbcolor "#F62817" axis x1y2 t "气温"


这里的气温数据使用了图像右边的第二纵轴 y2,但是 y2 轴上的刻度并没有变化,依然是左边 y1 轴的镜像。我们在这里有两件事要做:
  1. 去除右边纵轴上的 y1 刻度镜像,否则这些刻度标记将和新的 y2 刻度标记混起来,导致无法识别;
  2. 在右边纵轴上加上 y2 刻度标记。
我们执行下面的命令:
gnuplot> set ytics nomirror
gnuplot> set y2tics
gnuplot> replot

好了,现在降水量和温度数据分别对应于左侧和右侧的纵坐标。

看到这里,我们可能有点怀念我们上一讲谈到的 grid。如果能加上栅格,数据图示就更清楚了。但是现在我们有两组不同的纵坐标,如果都开启栅格,还不乱套了? set grid 命令允许我们在开启栅格时,选择使用哪一组坐标。例如:
gnuplot> set grid xtics y2tics
会开启 x1 y2 的栅格。但是这还是不能兼顾两组数据。最好的解决方案是,让两个纵轴有相同数目的分格,这样两套 grid 也就重合了,开启任何一个就可以了。例如,上面的图中左侧纵轴有 10 个分格,我们让右侧纵轴也有 10 个分格:
gnuplot> set y2range [-10:40]
gnuplot> set y2tics 5
gnuplot> set grid
gnuplot> replot

现在看起来好多了。

最后,不知道大家注意到没有,在开始的 plot 命令里,我们用了新的方式定义图线颜色。在 第七讲“点线风格”里,我们提到过,可以用预定义的数字代码来定义图线颜色。但是在这里,我们使用了 rgbcolor 来定义颜色,这很大程度上增加了颜色选择范围,允许更好的显示效果。而其用法也很简单,就是在 rgbcolor 之后,加上颜色的 RGB 代码,了解 HTML 的朋友应该对这个不陌生。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将数据文件中的数据制成折线图,需要先将数据文件中的每一行按照空格分割成多个字符串,然后提取第二个字符串之后的数据并存储到一个数组中,最后使用gnuplot程序进行绘图。以下是使用C++和system调用gnuplot程序绘制折线图的示例代码: ```cpp #include <iostream> #include <fstream> #include <cstdlib> #include <cstring> using namespace std; int main() { // 读取数据文件 ifstream dataFile("data.txt"); string line; string data; while (getline(dataFile, line)) { size_t pos = line.find_first_of(" "); pos = line.find_first_not_of(" ", pos); data += line.substr(pos) + " "; } dataFile.close(); // 绘制折线图 string command = "gnuplot -e \"set term png; set output 'output.png'; plot '-' with lines;\""; FILE* gnuplotPipe = popen(command.c_str(), "w"); if (gnuplotPipe) { // 发送数据 fputs(data.c_str(), gnuplotPipe); fputs("e\n", gnuplotPipe); fflush(gnuplotPipe); // 关闭管道 pclose(gnuplotPipe); } return 0; } ``` 在代码中,首先使用`ifstream`类读取数据文件,并使用`getline()`函数逐行读取数据。然后,使用`find_first_of()`和`find_first_not_of()`函数提取每行数据中的第二个字符串之后的数据,并将提取出的数据拼接成一个字符串。接着,使用`system()`函数调用gnuplot程序并设置绘图输出为PNG格式的文件,并使用管道向gnuplot程序发送绘图指令和数据。最后,关闭管道。 需要注意的是,以上代码中使用了`popoen()`函数和管道向gnuplot程序发送绘图指令和数据,需要确保系统中已经安装了gnuplot程序。此外,具体实现可能需要根据数据文件的格式和内容进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值