在用 gnuplot 绘制的曲线上调出两个特定点

Call out two specific points on a curve drawn with gnuplot

我正在 gnuplot 中绘制曲线。我想指出曲线上的几个具体点。

曲线是这样的:

下面显示的是我希望得到的(但我必须使用 GIMP 将点和线绘制到轴上)。我想指出曲线上的两个特定点。第一个,其中 Vgs(x 轴)等于 -0.5。第二个,其中 Id(y 轴)等于 2.5。如果可能的话,我还想在轴上画一条虚线以帮助读取值。

我找到了一个参考资料,说尝试使用 set object circle 和坐标绘制一个圆,但我肯定做错了,因为它抱怨额外的参数。到目前为止浏览手册是不成功的。我什至不确定要搜索什么词。

有没有一种简单的方法可以在我绘制的曲线上标出几个点,并使其看起来类似于下面的屏幕截图?

以下是我用来绘制曲线的命令:

set xlabel "Vgs (Volts)"
set ylabel "Id (mA)"
set grid
Idss=5
Vgs_off=-1
Id(Vgs) = Idss * (1 - (Vgs / Vgs_off) ) ** 2
plot [Vgs=Vgs_off:0][0:Idss + 1] Id(Vgs)

如果有人好奇的话,这是 Fairchild J112 JFET 的特性曲线。

编辑为将分母中的 -1 替换为 Vgs_off 以避免混淆。这是 JFET 数据表中的一个值,在这种特殊情况下恰好为 -1。

附录:

在结合@Eldrad 给出的答案后,我想出了 JFET 特性曲线的这种改进表示:

以下是用于创建它的命令:

# JFET parameters from data sheet
Vgs_off=-1
Idss=5

# JFET characteristic curve 
Id(Vgs) = Idss * (1 - (Vgs / Vgs_off) ) ** 2

# Graph properties
set title "I_D vs V_{GS}"
set xlabel "V_{GS} (Volts)"
set ylabel "I_D (mA)"
set grid
set key off
set monochrome

# Plot the characteristic curve
plot [Vgs=Vgs_off:0][0:Idss] Id(Vgs)

# Plot interesting points
set object circle center 0.5 * Vgs_off, Id(0.5 * Vgs_off) radius char 0.33 fillstyle solid fillcolor rgb 'black'
set object circle center 0.293 * Vgs_off, Id(0.293 * Vgs_off) radius char 0.33 fillstyle solid fillcolor rgb 'black'

# Mark interesting points with dashed lines to where they intersect the x and y axes.
set arrow from first 0.5 * Vgs_off, graph 0 to first 0.5 * Vgs_off, graph 1 dashtype "-" nohead
set arrow from graph 0, first Id(0.5 * Vgs_off) to graph 1, first Id(0.5 * Vgs_off) dashtype "-" nohead
set arrow from 0.293 * Vgs_off, graph 0 to 0.293 * Vgs_off, graph 1 dashtype "_" nohead
set arrow from graph 0, first Id(0.293 * Vgs_off) to graph 1, first Id(0.293 * Vgs_off) dashtype "_" nohead

# Label the lines
set label "I_{DSS}" at graph 1.01, graph 1
set label "I_{DSS} / 2" at graph 1.01, graph 0.50
set label "I_{DSS} / 4" at graph 1.01, graph 0.25
set rmargin at screen 0.9

# Update the graph
replot

如果函数 y=f(x) 及其反函数 x=f(y) 具有解析表达式,则获取函数的特定值很简单,就像您的情况一样。

关于您的函数定义的几点说明:您应该使用 x 作为变量,因为这是 gnuplot 正在寻找的默认值,它还使 plot 命令更短。此外,除以 -1 与在前面加上减号相同,因此更简单的函数定义(包括逆函数)为:

Idss = 5.0
Id (x) = Idss * (1 + x)**2
Id_inv (x) = sqrt(x/Idss) -1

现在虚线可以画成箭头了(勾选set arrow):

set arrow 11 from first -0.5, graph 0 to first -0.5, first Id(-0.5) lc "red" lw 2 dt 2 nohead
set arrow 12 from first -0.5, Id(-0.5) to graph 0, first Id(-0.5) lc "red" lw 2 dt 2 nohead
set arrow 21 from first Id_inv(2.5), graph 0 to Id_inv(2.5), 2.5 lc "green" lw 2 dt 2 nohead
set arrow 22 from first Id_inv(2.5), 2.5 to graph 0, first 2.5 lc "green" lw 2 dt 2 nohead

我建议将水平线绘制到实际打印抽动的轴(即左侧)。参考点是函数的 x 或 y 值和图形的边界,请参阅有关 coordinates 的手册以获取详细说明。 您可以在这些点添加特定的刻度线:

set xtics add (-0.5, Id_inv(2.5))
set ytics add (Id(-0.5), 2.5)

你在评论中也问了点,得到了正确的做法。圆的大小可以在任何坐标系中选择(我认为character是字母的宽度-x?-在当前字体中,但我不是100%确定)

set object 1 circle center -0.5,Id(-0.5) radius first 0.01 fs solid noborder fc "red"
set object 2 circle center Id_inv(2.5),2.5 radius first 0.01 fs solid noborder fc "green"

现在可以添加剩余的装饰:

set title "{/:Italic I}_d vs {/:Italic V}_{gs}"
set xlabel "{/:Italic V}_{gs} /V"
set ylabel "{/:Italic I}_d /mA"
set xrange [-1:0]
plot Id(x)