如何使用Plots.jl将特定的x刻度线,标签和垂直线添加到绘图?

时间:2018-08-02 10:30:38

标签: plot julia

我试图在图上添加两条垂直线,并在x轴上带有相应的刻度和标签以突出显示重要点。

我发现了两种方法(紧随其后的是A和B),但是在第一种方法中,新的刻度/标签取代了旧的刻度/标签,而不是附加了旧的;在第二种方法中,标签打印在某种程度上不一致的位置(取决于范围),并且无法让它们到达我希望的位置:

using Plots, StatPlots, DataFrames
pyplot()
df = DataFrame(a = 1:10, b = 10*rand(10), c = 10 * rand(10))
f = Plots.font("DejaVu Sans", 10)
@df df plot(:a, [:b :c], label=["serie a" "serie b"], xtickfont=f, ytickfont=f, legendfont=f, guidefont=f, titlefont=f)

A:

plot!([5,7], seriestype="vline", xticks = ([5,7],["\$\\bar \\delta \$","\$\\bar \\gamma \$"]), label="")

显示如下: screenshot of A

B:

plot!([5], seriestype="vline", label="")
annotate!(5, 0, text("\$ \\bar \\delta \$",f, :bottom, :left))
plot!([7], seriestype="vline", label="")
annotate!(7, 0, text("\$\\bar \\gamma \$",f, :top)

显示如下: screenshot of B

1 个答案:

答案 0 :(得分:3)

一种解决方案是从原始绘图中获取 xticks 并将它们与您想要的 xticks 合并。下面是一个接近你的例子的 MWE

using Plots, DataFrames
df = DataFrame(a = 1:10, b = 10rand(10), c = 10rand(10))
plt = plot(df.a, [df.b df.c], label=["serie a" "serie b"])
old_xticks = xticks(plt[1]) # grab xticks of the 1st subplot
new_xticks = ([5, 8], ["\$\\bar \\delta\$", "\$\\bar \\gamma\$"])
vline!(new_xticks[1])
keep_indices = findall(x -> all(x .≠ new_xticks[1]), old_xticks[1])
merged_xticks = (old_xticks[1][keep_indices] ∪ new_xticks[1], old_xticks[2][keep_indices] ∪ new_xticks[2])
xticks!(merged_xticks)

并产生

enter image description here

请注意,我特意将您的索引 7 移至 8,因此我必须小心地删除那里的原始 xtick,以便此解决方案更通用。

另请注意,在 Plots.jl v1.13.0 中添加了诸如 xticks 之类的 ticks-getter 函数。