在Plots.jl子图中添加全局标题

12
我想在使用Plots.jl创建的一组子图中添加全局标题。
最理想情况下,我想这样做:
using Plots
pyplot()
plot(rand(10,2), plot_title="Main title", title=["A" "B"], layout=2)

但是,根据Plots.jl文档,目前尚未实现plot_title属性:

整个图的标题(而非子图)(注意:目前未实现)

在此期间,有没有什么变通方法?

我目前正在使用pyplot后端,但我并不特别依赖它。


1
您可以使用注释来添加文本。将其置于图绘制区域的中心,并将其放大。 - Chris Rackauckas
据我所知,注释必须放置在数据坐标上,如果我尝试将它们放置在图外,它们根本不会出现。它们似乎也适用于每个子图。我如何使用它来制作标题并不清楚。我错过了什么? - Nicolas Payette
你以前可以做到这一点,但目前我认为你不能。@ChrisRackauckas 你在这里想做什么?annotate!将注释所有子图。 - pkofod
我不知道如果它超出了子图,它会消失。这让事情变得有些沮丧。 - Chris Rackauckas
图表标题现在可以工作了! - Matt Krause
4个回答

8

Plots.jl的新版本支持plot_title属性,用于为整个图形提供标题。这可以与单独图形的标题相结合使用。

using Plots   

layout = @layout [a{0.66w} b{0.33w}]
LHS = heatmap(rand(100, 100), title="Title for just the heatmap")
RHS = plot(1:100, 1:100, title="Only the line")
plot(LHS, RHS, plot_title="Overall title of the plot")

或者,您可以直接为现有图表设置标题。

p = plot(LHS, RHS)
p[:plot_title] = "Overall title of the plot"
plot(p)

Example plot, produced by the code above


8

这种方法有点取巧,但是与后端无关。基本上创建一个只包含所需标题的新图表,然后使用 layout 将其叠加在顶部即可。以下是使用 GR 后端的示例:

# create a transparent scatter plot with an 'annotation' that will become title
y = ones(3) 
title = Plots.scatter(y, marker=0,markeralpha=0, annotations=(2, y[2], Plots.text("This is title")),axis=false, grid=false, leg=false,size=(200,100))

# combine the 'title' plot with your real plots
Plots.plot(
    title,
    Plots.plot(rand(100,4), layout = 4),
    layout=grid(2,1,heights=[0.1,0.9])
)

生成:

输入图像描述


干得好,我会使用它直到 plot_title 被实现。 - Merlin

1
当使用pyplot后端时,您可以使用PyPlot命令来修改Plots图形,参见 使用Julia Plots访问特定于后端的功能
要为整个图设置标题,您可以执行以下操作:
using Plots
p1 = plot(sin, title = "sin")
p2 = plot(cos, title = "cos")
p = plot(p1, p2, top_margin=1cm)
import PyPlot
PyPlot.suptitle("Trigonometric functions")
PyPlot.savefig("suptile_test.png")

需要显式调用PyPlot.savefig才能看到PyPlot函数的效果。

请注意,使用PyPlot接口进行的所有更改都将在使用Plots函数时被覆盖。


很抱歉花了这么长时间才接受你的答案:你的示例很好用,但在我的实际使用情况中,尝试使用PyPlot.suptitle导致了图形的其余部分消失。我从未弄清楚为什么。最终我转而使用Gadfly(不仅仅是因为这个原因)。感谢你的帮助! - Nicolas Payette

0

subplotsPlot 类型的字段,每个子图都有一个称为 :attr 的字段,您可以修改并重新使用 display() 绘图。请尝试以下操作:

julia> l = @layout([a{0.1h} ;b [c; d e]])
Plots.GridLayout(2,1)

julia> p = plot(randn(100,5),layout=l,t=[:line :histogram :scatter :steppre :bar],leg=false,ticks=nothing,border=false)

julia> p.subplots
5-element Array{Plots.Subplot,1}:
 Subplot{1}
 Subplot{2}
 Subplot{3}
 Subplot{4}
 Subplot{5}

julia> fieldnames(p.subplots[1])
8-element Array{Symbol,1}:
 :parent     
 :series_list
 :minpad     
 :bbox       
 :plotarea   
 :attr       
 :o          
 :plt

julia> for i in 1:length(p.subplots)
           p.subplots[i].attr[:title] = "subtitle $i"
       end

 julia> display(p)

现在你应该在每个subplot中看到一个标题


5
他的意思并不是这样,他想要一个整体情节的标题,然后再加上副标题。 - pkofod
1
谢谢您的回答,但@pkofod是正确的:我正在寻找一个大标题来覆盖所有子图,而不是每个子图都有一个标题。 - Nicolas Payette
抱歉回复得匆忙,我正在处理子图标题时看到了这个问题,没有仔细阅读。matplotlib的Figure对象有一个suptitle属性,虽然你可以通过p.o[:suptitle]访问和设置它,但它不想显示标题。 - Yasha
没问题!是的,我也尝试访问suptitle,但也无法使其工作。 - Nicolas Payette
@tim:感谢你指出savefig的要求和链接! - Yasha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接