如何在 Octave 中编写滑块以获得交互式绘图?
How to code a slider in Octave to have interactive plot?
我的目标是制作一个图表来显示外汇市场上的随机震荡指标,并且为了验证哪个参数是设置它的最佳参数,我会使用滑块对其进行修改并在图表上显示更新的结果。
我有我的历史数据,对于一个定义的货币对(比如 AUDUSD),在加载它之后,我计算随机震荡指标:
function [stoch, fk, dk] = stochastic(n, k, d)
X=csvread("AUDUSD_2017.csv");
C=X(2:length(X),5);
L=X(2:length(X),4);
H=X(2:length(X),3);
O=X(2:length(X),2);
for m=n:length(C)-n
stoch(m)=((C(m)-min(L(m-n+1:m)))/(max(H(m-n+1:m))-min(L(m-n+1:m))))*100;
endfor
for m=n:length(C)-n
fk(m)=mean(stoch(m-d:m));
endfor
for m=n:length(C)-n
dk(m)=mean(fk(m-d:m));
endfor
endfunction
这是我在绘制 stoch、fk 和 dk 时得到的图片:
我会在图中添加 3 个滑块,以便在一定范围内更改作为输入的参数,即有一个滑块将第一个参数 "n" 在 3 和 50 之间更改,"k" 在 2 和 20 之间,"d" 在 2 和 20 之间。
我会在 Octave 中使用 UI 包,有人可以告诉我在我使用滑块时更新情节吗?
弗朗切斯科
看看 at this demo,它会给你一个 window 应该可以回答你所有问题的答案:
您的具体问题的相关部分是:
h.noise_slider = uicontrol ("style", "slider",
"units", "normalized",
"string", "slider",
"callback", @update_plot,
"value", 0.4,
"position", [0.05 0.25 0.35 0.06]);
....
noise = get (h.noise_slider, "value");
一定要使用Qt工具包!
安迪在评论中指出,我链接到的示例在开箱即用的八度音阶上不起作用;这是因为 Octave 暂时不喜欢某些东西的嵌套函数,所以我在下面复制了一个 'octave version'。
%%%%%% In file myplot.m %%%%%
function myplot
%% Create initial figure and spiral plot
figure; axes ('position', [0.1, 0.3, 0.8, 0.6]);
global t; t = linspace (0, 8*pi, 100);
x = t .* cos(t); y = t .* sin(t);
plot (x, y); axis ([-100, 100, -100, 100]);
%% Add ui 'slider' element
hslider = uicontrol ( ...
'style', 'slider', ...
'Units', 'normalized', ...
'position', [0.1, 0.1, 0.8, 0.1], ...
'min', 1, ...
'max', 50, ...
'value', 10, ...
'callback', {@plotstuff} ...
);
end
%% Callback function called by slider event
%% Also in file myplot.m (i.e. a subfunction)
function plotstuff (h, event)
global t;
n = get (h, 'value');
x = n * t .* cos(t); y = n * t .* sin(t);
plot (x, y); axis ([-100, 100, -100, 100]);
end
我的目标是制作一个图表来显示外汇市场上的随机震荡指标,并且为了验证哪个参数是设置它的最佳参数,我会使用滑块对其进行修改并在图表上显示更新的结果。
我有我的历史数据,对于一个定义的货币对(比如 AUDUSD),在加载它之后,我计算随机震荡指标:
function [stoch, fk, dk] = stochastic(n, k, d)
X=csvread("AUDUSD_2017.csv");
C=X(2:length(X),5);
L=X(2:length(X),4);
H=X(2:length(X),3);
O=X(2:length(X),2);
for m=n:length(C)-n
stoch(m)=((C(m)-min(L(m-n+1:m)))/(max(H(m-n+1:m))-min(L(m-n+1:m))))*100;
endfor
for m=n:length(C)-n
fk(m)=mean(stoch(m-d:m));
endfor
for m=n:length(C)-n
dk(m)=mean(fk(m-d:m));
endfor
endfunction
这是我在绘制 stoch、fk 和 dk 时得到的图片:
我会在图中添加 3 个滑块,以便在一定范围内更改作为输入的参数,即有一个滑块将第一个参数 "n" 在 3 和 50 之间更改,"k" 在 2 和 20 之间,"d" 在 2 和 20 之间。
我会在 Octave 中使用 UI 包,有人可以告诉我在我使用滑块时更新情节吗?
弗朗切斯科
看看 at this demo,它会给你一个 window 应该可以回答你所有问题的答案:
您的具体问题的相关部分是:
h.noise_slider = uicontrol ("style", "slider",
"units", "normalized",
"string", "slider",
"callback", @update_plot,
"value", 0.4,
"position", [0.05 0.25 0.35 0.06]);
....
noise = get (h.noise_slider, "value");
一定要使用Qt工具包!
安迪在评论中指出,我链接到的示例在开箱即用的八度音阶上不起作用;这是因为 Octave 暂时不喜欢某些东西的嵌套函数,所以我在下面复制了一个 'octave version'。
%%%%%% In file myplot.m %%%%%
function myplot
%% Create initial figure and spiral plot
figure; axes ('position', [0.1, 0.3, 0.8, 0.6]);
global t; t = linspace (0, 8*pi, 100);
x = t .* cos(t); y = t .* sin(t);
plot (x, y); axis ([-100, 100, -100, 100]);
%% Add ui 'slider' element
hslider = uicontrol ( ...
'style', 'slider', ...
'Units', 'normalized', ...
'position', [0.1, 0.1, 0.8, 0.1], ...
'min', 1, ...
'max', 50, ...
'value', 10, ...
'callback', {@plotstuff} ...
);
end
%% Callback function called by slider event
%% Also in file myplot.m (i.e. a subfunction)
function plotstuff (h, event)
global t;
n = get (h, 'value');
x = n * t .* cos(t); y = n * t .* sin(t);
plot (x, y); axis ([-100, 100, -100, 100]);
end