gnuplot -- 绘图范围与轴范围不同
gnuplot -- plot range different from axes range
我有这个非常简单、有效的 gnuplot 代码:
splot x * x
这绘制了一个从 -10 < x < 10 和 -10 < y < 10 的曲面。
我想从 -10 < x < 10 和 -10 < y < -9 绘制相同的曲面,但是我仍然希望图形的轴使用 -10 < x < 10 和 -10 < y < 10。轴边界不应更改,但绘制的值范围应更小。
换句话说,在绘图的一小部分中,曲面应该看起来像一条细带。其余的应该是空的 space。下面是使用我拥有的图表创建我想要的东西的非常糟糕的努力。
我试过操纵 yrange
,但这同时改变了表面边界和轴边界。我也试过禁用 autoscale
但我不确定下一步该怎么做。
一种方法是通过 parametric
模式,它为您提供一组单独的坐标(u
和 v
)来设置
的范围
f(x,y) = x*x
set xrange [-10:10]
set yrange [-10:10]
set urange [-10:10]
set vrange [-10:-9]
set parametric
splot u, v, f(u,v)
或者,您可以使用 ++
特殊文件名而不是 parametric
模式来达到相同的效果:
f(x,y) = x*x
set xrange [-10:10]
set yrange [-10:10]
set urange [-10:10]
set vrange [-10:-9]
splot "++" u 1:2:(f(,)) w l
在当前的 gnuplot(版本 5.2.4)中,无论是否启用参数模式,您都可以将采样范围与轴范围分开。请参见在线演示集中的示例:
sampling.html (see plot #9)
将编程语言与 gnuplot 结合使用可能会更好地控制绘图。
这是一个使用 c 和脚本的示例。
plot.c
#include <stdio.h>
#include <math.h>
int main()
{
int x, y;
double z;
for (y=-10; y <= 10; y++)
{
for (x=-10; x <= 10; x++)
{
z = x * 0.025;
printf("%f %f %f\n", (double)x, (double)y, 100 - cos(z * M_PI*2) * 100);
}
printf("\n");
}
fflush(stdout);
return 0;
}
plot.bat
gcc plot.c -o prog.exe -lm
prog > data.txt
echo splot "data.txt" using 1:2:3 with lines | gnuplot -p
plot.sh
gcc plot.c -o prog -lm
./prog > data.txt
echo 'splot "data.txt" using 1:2:3 with lines' | gnuplot -p
这是一个使用 python 和脚本的示例。
它将输出:
plot.py
import math
print("\"Surface One\"")
for y in range(-10, 10+1):
for x in range(-10, 10+1):
z = x * 0.025
print("%f %f %f 1" % (float(x), float(y), 100 - math.cos(z * math.pi*2) * 100))
print("")
print("")
print("\"Surface Two\"")
for y in range(-10, -8+1):
for x in range(-10, 10+1):
z = x * 0.025
print("%f %f %f 2" % (float(x), float(y), 100 - math.cos(z * math.pi*2) * 100))
print("")
print("")
print("\"Surface Three\"")
for y in range(-10, 10+1):
for x in range(-10, 10+1):
z = x * 0.1
print("%f %f %f 7" % (float(x)/2, float(y)/2, math.sin(z * math.pi*2) * 10))
print("")
print("")
plot.bat
cd %~dp0
python plot.py > data.txt
echo ^
set terminal wxt size 570,420; ^
stats "data.txt" u 1:2 nooutput; ^
set border 0x7F linecolor rgb "#555555"; ^
set grid xtics linecolor rgb "#888888" linewidth 0.2 linetype 9; ^
set grid ytics linecolor rgb "#888888" linewidth 0.2 linetype 9; ^
set grid ztics linecolor rgb "#888888" linewidth 0.2 linetype 9; ^
set xrange [-10.0:10.0]; ^
set yrange [-10.0:10.0]; ^
set zrange [-10.0:100.0]; ^
splot for [IDX=0:STATS_blocks-1] "data.txt" i IDX using 1:2:3:4 with lines ^
lc variable title columnheader(1) | gnuplot -p
plot.sh
#!/bin/bash
python plot.py > data.txt
echo \
'set terminal wxt size 570,420; \
stats "data.txt" u 1:2 nooutput; \
set border 0x7F linecolor rgb "#555555"; \
set grid xtics linecolor rgb "#888888" linewidth 0.2 linetype 9; \
set grid ytics linecolor rgb "#888888" linewidth 0.2 linetype 9; \
set grid ztics linecolor rgb "#888888" linewidth 0.2 linetype 9; \
set xrange [-10.0:10.0]; \
set yrange [-10.0:10.0]; \
set zrange [-10.0:100.0]; \
splot for [IDX=0:STATS_blocks-1] "data.txt" i IDX using 1:2:3:4 with lines \
lc variable title columnheader(1)' | gnuplot -p
没有明确说明的例子parametric
这在 中提到,文档 link,这里是一个最小的例子:
set terminal png
set output 'splot-domain.png'
# Number of x and y samples.
set isosamples 10, 5
# Plotted domain.
set urange [-5.0 : 0.0]
set vrange [-5.0 : 5.0]
# Visible domain.
set xrange [-5.0 : 5.0]
set yrange [-5.0 : 5.0]
# Just to make plot look nicer.
set hidden3d
set xyplane at 0
set xlabel 'x'
set ylabel 'y'
splot '++' using 1:2:(**2) with lines
输出:
在 gnuplot 5.2 补丁级别 8 上测试。
我有这个非常简单、有效的 gnuplot 代码:
splot x * x
这绘制了一个从 -10 < x < 10 和 -10 < y < 10 的曲面。
我想从 -10 < x < 10 和 -10 < y < -9 绘制相同的曲面,但是我仍然希望图形的轴使用 -10 < x < 10 和 -10 < y < 10。轴边界不应更改,但绘制的值范围应更小。
换句话说,在绘图的一小部分中,曲面应该看起来像一条细带。其余的应该是空的 space。下面是使用我拥有的图表创建我想要的东西的非常糟糕的努力。
我试过操纵 yrange
,但这同时改变了表面边界和轴边界。我也试过禁用 autoscale
但我不确定下一步该怎么做。
一种方法是通过 parametric
模式,它为您提供一组单独的坐标(u
和 v
)来设置
f(x,y) = x*x
set xrange [-10:10]
set yrange [-10:10]
set urange [-10:10]
set vrange [-10:-9]
set parametric
splot u, v, f(u,v)
或者,您可以使用 ++
特殊文件名而不是 parametric
模式来达到相同的效果:
f(x,y) = x*x
set xrange [-10:10]
set yrange [-10:10]
set urange [-10:10]
set vrange [-10:-9]
splot "++" u 1:2:(f(,)) w l
在当前的 gnuplot(版本 5.2.4)中,无论是否启用参数模式,您都可以将采样范围与轴范围分开。请参见在线演示集中的示例: sampling.html (see plot #9)
将编程语言与 gnuplot 结合使用可能会更好地控制绘图。
这是一个使用 c 和脚本的示例。
plot.c
#include <stdio.h>
#include <math.h>
int main()
{
int x, y;
double z;
for (y=-10; y <= 10; y++)
{
for (x=-10; x <= 10; x++)
{
z = x * 0.025;
printf("%f %f %f\n", (double)x, (double)y, 100 - cos(z * M_PI*2) * 100);
}
printf("\n");
}
fflush(stdout);
return 0;
}
plot.bat
gcc plot.c -o prog.exe -lm
prog > data.txt
echo splot "data.txt" using 1:2:3 with lines | gnuplot -p
plot.sh
gcc plot.c -o prog -lm
./prog > data.txt
echo 'splot "data.txt" using 1:2:3 with lines' | gnuplot -p
这是一个使用 python 和脚本的示例。
它将输出:
plot.py
import math
print("\"Surface One\"")
for y in range(-10, 10+1):
for x in range(-10, 10+1):
z = x * 0.025
print("%f %f %f 1" % (float(x), float(y), 100 - math.cos(z * math.pi*2) * 100))
print("")
print("")
print("\"Surface Two\"")
for y in range(-10, -8+1):
for x in range(-10, 10+1):
z = x * 0.025
print("%f %f %f 2" % (float(x), float(y), 100 - math.cos(z * math.pi*2) * 100))
print("")
print("")
print("\"Surface Three\"")
for y in range(-10, 10+1):
for x in range(-10, 10+1):
z = x * 0.1
print("%f %f %f 7" % (float(x)/2, float(y)/2, math.sin(z * math.pi*2) * 10))
print("")
print("")
plot.bat
cd %~dp0
python plot.py > data.txt
echo ^
set terminal wxt size 570,420; ^
stats "data.txt" u 1:2 nooutput; ^
set border 0x7F linecolor rgb "#555555"; ^
set grid xtics linecolor rgb "#888888" linewidth 0.2 linetype 9; ^
set grid ytics linecolor rgb "#888888" linewidth 0.2 linetype 9; ^
set grid ztics linecolor rgb "#888888" linewidth 0.2 linetype 9; ^
set xrange [-10.0:10.0]; ^
set yrange [-10.0:10.0]; ^
set zrange [-10.0:100.0]; ^
splot for [IDX=0:STATS_blocks-1] "data.txt" i IDX using 1:2:3:4 with lines ^
lc variable title columnheader(1) | gnuplot -p
plot.sh
#!/bin/bash
python plot.py > data.txt
echo \
'set terminal wxt size 570,420; \
stats "data.txt" u 1:2 nooutput; \
set border 0x7F linecolor rgb "#555555"; \
set grid xtics linecolor rgb "#888888" linewidth 0.2 linetype 9; \
set grid ytics linecolor rgb "#888888" linewidth 0.2 linetype 9; \
set grid ztics linecolor rgb "#888888" linewidth 0.2 linetype 9; \
set xrange [-10.0:10.0]; \
set yrange [-10.0:10.0]; \
set zrange [-10.0:100.0]; \
splot for [IDX=0:STATS_blocks-1] "data.txt" i IDX using 1:2:3:4 with lines \
lc variable title columnheader(1)' | gnuplot -p
没有明确说明的例子parametric
这在
set terminal png
set output 'splot-domain.png'
# Number of x and y samples.
set isosamples 10, 5
# Plotted domain.
set urange [-5.0 : 0.0]
set vrange [-5.0 : 5.0]
# Visible domain.
set xrange [-5.0 : 5.0]
set yrange [-5.0 : 5.0]
# Just to make plot look nicer.
set hidden3d
set xyplane at 0
set xlabel 'x'
set ylabel 'y'
splot '++' using 1:2:(**2) with lines
输出:
在 gnuplot 5.2 补丁级别 8 上测试。