如何绘制混合整数问题结果?
How can I plot mixed integer problem result?
我解决了一个线性双 objective 混合整数问题,我想绘制结果。结果包括线和点。例如
list=[([0.0; 583000.0], 0), ([190670.0; 149600.0], 0), ([69686.0, 385000.0], 1), ([33296.0, 484000.0], 1), ([136554.0, 2.38075e5], 1), ([24556.0, 503800.0], 0), ([47462.0, 437800.0], 1), ([129686.0, 253000.0], 1), ([164278.0, 178200.0], 1)]
在这个列表中第三个点([69686.0, 385000.0], 1)
第二个元素1
确定这个点用线连接到前面的点([190670.0; 149600.0], 0)
用线连接到第二个点。
我编码如下:
using JuMP,Plots
list=[([0.0, 583000.0], 0), ([24556.0, 503800.0], 0), ([33296.0, 484000.0],1), ([47462.0, 437800.0], 1), ([69686.0, 385000.0], 1), ([129686.0, 253000.0], 1), ([136554.0, 23805.0], 1), ([164278.0, 178200.0], 1), ([190670.0, 149600.0], 0)]
x=zeros(1,1)
for i=1:size(list,1)
x=[x;list[i][1][1]]
end
row=1
x = x[setdiff(1:end, row), :]
y=zeros(1,1)
for i=1:size(list,1)
y=[y;list[i][1][2]]
end
row=1
y = y[setdiff(1:end, row), :]
for i=2:size(list,1)
if list[i][2]==0
plot(Int(x[i]),Int(y[i]),seriestype=:scatter)
plot(Int(x[i+1]),Int(y[i+1]),seriestype=:scatter)
end
if list[i][2]==1
plot(Int(x[i]),Int(y[i]))
plot(Int(x[i+1]),Int(y[i+1]))
end
end
但是没有用。你能帮帮我吗
谢谢
您可以简单地将每个线段的 x 和 y 值推送到两个单独的数组,即下面代码中的 x
和 y
。在每个线段的值(即 x1 和 x2 或 y1 和 y2)之后将 NaN
放入数组中。如果不应该有连接,这将阻止将线段连接到下一个线段。 (例如,您看到 1 然后看到 0 的情况)。最后 plot(x, y)
.
下面的代码片段可以做到这一点。请注意,allx
和 ally
用于保存所有点,无论连接状态如何。您可能希望从中排除连接点。 x
和 y
保存连接的线段。
using Plots
x, y, allx, ally = Float64[], Float64[], Float64[], Float64[]
# iterate through list
for i = 1:length(list)-1
if list[i+1][2] == 1
# push x1 from the first point, x2 from the second and a `NaN`
push!(x, list[i][1][1], list[i+1][1][1], NaN)
# push y1, y2, `NaN`
push!(y, list[i][1][2], list[i+1][1][2], NaN)
end
push!(allx, list[i][1][1])
push!(ally, list[i][1][2])
end
push!(allx, list[end][1][1])
push!(ally, list[end][1][2])
# scatter all points
scatter(allx, ally)
# plot connections with markers
plot!(x, y, linewidth=2, color=:red, marker=:circle)
这应该会给你想要的情节。
如果你碰巧使用Gadfly.jl
而不是Plots.jl
,你可以得到与
类似的情节
using Gadfly
connectedpoints = layer(x=x, y=y, Geom.path, Geom.point, Theme(default_color="red"))
allpoints = layer(x=allx, y=ally, Geom.point)
plot(connectedpoints, allpoints)
作为旁注,如果您打算在已创建的绘图对象之上绘制另一个系列,则应使用 plot!
而不是 plot
。
我解决了一个线性双 objective 混合整数问题,我想绘制结果。结果包括线和点。例如
list=[([0.0; 583000.0], 0), ([190670.0; 149600.0], 0), ([69686.0, 385000.0], 1), ([33296.0, 484000.0], 1), ([136554.0, 2.38075e5], 1), ([24556.0, 503800.0], 0), ([47462.0, 437800.0], 1), ([129686.0, 253000.0], 1), ([164278.0, 178200.0], 1)]
在这个列表中第三个点([69686.0, 385000.0], 1)
第二个元素1
确定这个点用线连接到前面的点([190670.0; 149600.0], 0)
用线连接到第二个点。
我编码如下:
using JuMP,Plots
list=[([0.0, 583000.0], 0), ([24556.0, 503800.0], 0), ([33296.0, 484000.0],1), ([47462.0, 437800.0], 1), ([69686.0, 385000.0], 1), ([129686.0, 253000.0], 1), ([136554.0, 23805.0], 1), ([164278.0, 178200.0], 1), ([190670.0, 149600.0], 0)]
x=zeros(1,1)
for i=1:size(list,1)
x=[x;list[i][1][1]]
end
row=1
x = x[setdiff(1:end, row), :]
y=zeros(1,1)
for i=1:size(list,1)
y=[y;list[i][1][2]]
end
row=1
y = y[setdiff(1:end, row), :]
for i=2:size(list,1)
if list[i][2]==0
plot(Int(x[i]),Int(y[i]),seriestype=:scatter)
plot(Int(x[i+1]),Int(y[i+1]),seriestype=:scatter)
end
if list[i][2]==1
plot(Int(x[i]),Int(y[i]))
plot(Int(x[i+1]),Int(y[i+1]))
end
end
但是没有用。你能帮帮我吗 谢谢
您可以简单地将每个线段的 x 和 y 值推送到两个单独的数组,即下面代码中的 x
和 y
。在每个线段的值(即 x1 和 x2 或 y1 和 y2)之后将 NaN
放入数组中。如果不应该有连接,这将阻止将线段连接到下一个线段。 (例如,您看到 1 然后看到 0 的情况)。最后 plot(x, y)
.
下面的代码片段可以做到这一点。请注意,allx
和 ally
用于保存所有点,无论连接状态如何。您可能希望从中排除连接点。 x
和 y
保存连接的线段。
using Plots
x, y, allx, ally = Float64[], Float64[], Float64[], Float64[]
# iterate through list
for i = 1:length(list)-1
if list[i+1][2] == 1
# push x1 from the first point, x2 from the second and a `NaN`
push!(x, list[i][1][1], list[i+1][1][1], NaN)
# push y1, y2, `NaN`
push!(y, list[i][1][2], list[i+1][1][2], NaN)
end
push!(allx, list[i][1][1])
push!(ally, list[i][1][2])
end
push!(allx, list[end][1][1])
push!(ally, list[end][1][2])
# scatter all points
scatter(allx, ally)
# plot connections with markers
plot!(x, y, linewidth=2, color=:red, marker=:circle)
这应该会给你想要的情节。
如果你碰巧使用Gadfly.jl
而不是Plots.jl
,你可以得到与
using Gadfly
connectedpoints = layer(x=x, y=y, Geom.path, Geom.point, Theme(default_color="red"))
allpoints = layer(x=allx, y=ally, Geom.point)
plot(connectedpoints, allpoints)
作为旁注,如果您打算在已创建的绘图对象之上绘制另一个系列,则应使用 plot!
而不是 plot
。