天道酬勤,学无止境

Adding global title to Plots.jl subplots

I would like to add a global title to a group of subplots using Plots.jl.

Ideally, I'd do something like:

using Plots
pyplot()
plot(rand(10,2), plot_title="Main title", title=["A" "B"], layout=2)

but, as per the Plots.jl documentation, the plot_title attribute is not yet implemented:

Title for the whole plot (not the subplots) (Note: Not currently implemented)

In the meanwhile, is there any way around it?

I'm currently using the pyplot backend, but I'm not especially tied to it.

标签

评论

This is a bit of a hack, but should be agnostic to the backend. Basically create a new plot where the only contents are the title you want, and then add it on top using layout. Here is an example using the GR backend:

# 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])
)

Produces:

When using the pyplot backend, you can use PyPlot commands to alter a Plots figure, cf. Accessing backend specific functionality with Julia Plots.

To set a title for the whole figure, you could do something like:

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")

One needs to explicitly call PyPlot.savefig to see the effect of the PyPlot functions.

Note that all changes made using the PyPlot interface will be overwritten when you use a Plots function.

subplots are fields of the Plot type, and each subplot has a field called :attr that you can modify and re-display() the plot. Try the following:

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)

You should now see a title in each subplot

More recent versions of Plots.jl support the plot_title attribute, which provides a title for the whole plot. This can be combined with individual titles of individual plots.

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")

Alternatively, you can set the title for an existing plot directly.

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

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何使用 Plots.jl 缩放字体大小(How to scale the fontsizes using Plots.jl)
    问题 有没有办法一次重新调整所有字体大小(图例、刻度标签、轴标签……)? Filippo Vicentini 在 Slack 上的原始问题。 回答1 可以使用titlefontsize 、 tickfontsize 、 legendfontsize 、 tickfontsize 、 guidefontsize和legendtitlefontsize属性控制单个字体大小,但我知道这可能非常乏味。 还有thickness_scaling属性。 plot(rand(10), thickness_scaling = 0.5) 然而,这也会影响线宽。 第三种选择是调用 Plots.scalefontsizes(α) 按因子α缩放所有字体大小。 这会更改所有后续绘图的全局字体大小默认值,并且可以使用以下命令撤消 Plots.scalefontsizes(1 / α) Daniel Schwabeneder 在 Slack 上的回答。
  • 如何使用 Plots.jl 在图像上绘图?(How plot on Images with Plots.jl?)
    问题 我想使用 Plots.jl 绘制图像,例如简单的正弦曲线。 这是我的代码: using Plots using Images gr() h = 400 w = 600 a = Array(RGB{FixedPointNumbers.UFixed{UInt8,8}}, h, w) img = Image(a) p=plot(img) x = collect(0:0.1:2π) plot!(x,sin(x)) png("Test") 但我得到错误的结果。 如何正确地做到这一点? 回答1 这是一个简单的例子,我希望能给你一些线索: julia> plot(img) julia> plot!(x->200sin(.05x)+300, 0, 700, w=5) 您可能只想确保绘制到与图像匹配的正确坐标。
  • How plot on Images with Plots.jl?
    I want using Plots.jl for plot on Images, for example simple sinusoid. Here my code: using Plots using Images gr() h = 400 w = 600 a = Array(RGB{FixedPointNumbers.UFixed{UInt8,8}}, h, w) img = Image(a) p=plot(img) x = collect(0:0.1:2π) plot!(x,sin(x)) png("Test") But I get wrong result. How do this correctly?
  • How to scale the fontsizes using Plots.jl
    is there a way to rescale all the fontsizes (legend, tickslabels, axislabels…) at once? Original question from Filippo Vicentini on Slack.
  • Matplotlib - global legend and title aside subplots
    I've started with matplot and managed some basic plots, but now I find it hard to discover how to do some stuff I need now :( My actual question is how to place a global title and global legend on a figure with subplots. I'm doing 2x3 subplots where I have a lot of different graphs in various colors (about 200). To distinguish (most) of them I wrote something like def style(i, total): return dict(color=jet(i/total), linestyle=["-", "--", "-.", ":"][i%4], marker=["+", "*", "1", "2", "3", "4", "s"][i%7]) fig=plt.figure() p0=fig.add_subplot(321) for i, y in enumerate(data): p0.plot(x, trans0(y),
  • 【车牌识别】基于matlab GUI模板匹配车牌库识别【含Matlab源码 416期】
    一、简介 基于matlab GUI车牌库识别: 该设计主要研究基于MATLAB软件的汽车号牌设别系统设计,系统主要包括图像采集、图像预处理、车牌定位、字符分割、字符识别五大核心部分。系统的图像预处理模块是将图像经过图像灰度化、图像增强、边缘提取、二值化等操作,转换成便于车牌定位的二值化图像;利用车牌的边缘、形状等特征,再结合Roberts 算子边缘检测、数字图像、形态学等技术对车牌进行定位;字符的分割采用的方法是将二值化后的车牌部分进行寻找连续有文字的块,若长度大于设定的阈值则切割,从而完成字符的分割;字符识别运用模板匹配算法完成。以上每个功能模块用MATLAB软件实现,最后识别出车牌,在研究设计的同时对其中出现的问题进行具体分析、处理,并寻求更优的方法。 二、源代码 close all; clc [fn,pn,fi] = uigetfile('*.jpg','请选择所要识别的图片'); I = imread([pn fn]); % 读取图像 参数为图像名称和图像路径 figure,imshow(I); title('原始图像'); %显示原始图像 figure(1),imshow(I);title('原图');%显示原始图像 I1=rgb2gray(I);%将彩图转换位灰度图I1 figure(2),subplot(1,2,1),imshow(I1);title('灰度图')
  • 数字图像处理11:阈值分割(基本全局阈值处理,Otsu 的最佳全局阈值,图像平滑改善全局阈值处理,图像分块的可变阈值)
    阈值分割 从背景中提取物体的一种明显方法是,选择一个将这些模式分开的阈值 T。然后, f ( x , y ) > T f(x,y)>T f(x,y)>T的任何点 (x, y) 称为个对象点,否则该点称为背景点。 灰度阈值的成功与否直接关系到可区分直方图模式的波谷的宽度和深度。 而影响波谷特性的关键因素有以下几点: (1)波峰间的间隔 (波峰离得越远,分离这些模式的机会越大); (2)图像中的噪声内容 (模式随噪声的增加而展宽); (3)物体和背景的相对尺寸; (4)光源的均匀性; (5)图像反射特性的均匀性。 基本全局阈值处理 当物体和背景像素的灰度分布十分明显时,可以用适用于整个图像的单个 (全局) 阈值。 实验思想 在大多数应用中,通常图像之间有较大变化,即使全局阈值是种合适的方法,也需要有能对每幅图像自动估计阈值的算法。下面的迭代算法可用于这一目的: 1.为全局阈值 T 选择一个初始估计值。 2.使用用初始的 T 分割该图像。这将产生两组像素: G1 由灰度值大于 T 的所有像素组成,G2 由所有小于等于 T 的像素组成。 3.对 G1 和 G2 的像素分别计算平均灰度值 (均值)m1 和 m2。 4.计算一个新的阈值: T = (m1 + m2)/2 5.重复步骤 2 到步骤 4,直到连续迭代中的 T 值间的差小于个预定义的参数 dT 为止。 代码 主函数: %% 运行
  • 从图像生成 PDF 并包含文本 [Python](Generate PDF from images and including text [Python])
    问题 我需要从四个图形图制作 PDF,这些图应该以横向和 2x2 矩阵(最好具有可控尺寸)显示。 这些图跟随一个标题,然后是一些描述性文本。 请向我推荐您认为对这项任务有用的那些命令和模块。 到目前为止,我基本上是通过使用 matplotlib 的 add_subplot() 功能,但我似乎无法使用 makePdf 添加文本/标题。 最好的问候,并感谢您的关注! 回答1 首先,为每个子图添加标题非常简单,可以在定义轴后使用set_title("Title")完成:(此示例取自 matplotlib 的参考) import matplotlib.pyplot as plt import numpy as np # Simple data to display in various forms x = np.linspace(0, 2 * np.pi, 400) y = np.sin(x ** 2) # Four axes, returned as a 2-d array f, axarr = plt.subplots(2, 2) axarr[0, 0].plot(x, y) axarr[0, 0].set_title('Title One') axarr[0, 1].scatter(x, y) axarr[0, 1].set_title('Title Two') axarr[1, 0
  • 【细胞分割】基于GUI阙值+边缘+形态学+种子点图像分割【Matlab 641期】
    一、简介 基于matlab GUI阙值、边缘、形态学、种子点图像分割 二、源代码 function varargout = bishe2(varargin) % BISHE2 MATLAB code for bishe2.fig % BISHE2, by itself, creates a new BISHE2 or raises the existing % singleton*. % % H = BISHE2 returns the handle to a new BISHE2 or the handle to % the existing singleton*. % % BISHE2('CALLBACK',hObject,eventData,handles,...) calls the local % function named CALLBACK in BISHE2.M with the given input arguments. % % BISHE2('Property','Value',...) creates a new BISHE2 or raises the % existing singleton*. Starting from the left, property value pairs are % applied to the GUI before
  • Matplotlib.pyplot - Deactivate axes in figure. /Axis of figure overlap with axes of subplot
    %load_ext autoreload %autoreload 2 %matplotlib inline import numpy as np import datetime as dt import pickle import pandas as pd import datetime from datetime import timedelta, date from datetime import date as dt import math import os import matplotlib.pyplot as plt plt.style.use('ggplot') from pylab import plot,show from matplotlib import ticker from matplotlib.backends.backend_pdf import PdfPages import matplotlib.dates as mdates import pylab as pl x_min_global=datetime.date(2010,1, 1)- timedelta(days=180) x_max_global=datetime.date(2015,1, 1)+ timedelta(days=180) d = pd.DataFrame(0, index
  • matplotlib绘图:散点图、折线图、柱状图、水平条形图、饼图和直方图
    目录 数据可视化Matplotlib安装和导入库安装Matplotlib库导入Matplotlib库中的`pyplot`子库 一、Matplotlib基础知识1. Figure对象1.1 定义1.2 划分子图1.3 设置中文字体1.4 添加标题1.5 调整子图 二、散点图引入scatter()函数 二、折线图plot()函数 三、柱状图1. 普通柱形图2. 并列柱形图3. 堆叠条形图4. 柱线混合图 四、水平条形图五、饼图五、直方图 ) 数据可视化 数据分析阶段:理解和洞察数据之间的关系算法调试阶段:发现问题,优化算法项目总结阶段:展示项目成果 Matplotlib Matplotlib 是Python中类似 MATLAB 的绘图工具,可以快速方便地生成高质量的图标 安装和导入库 安装Matplotlib库 Anaconda:安装了anaconda之后,Matplotlib就已经安装好了pip pip install matplotlib 导入Matplotlib库中的pyplot子库 import matplotlib.pyplot as plt matplotlib.pyplot是一个有命令风格的函数集合,它看起来和MATLAB很相似。每一个pyplot函数都使一副图像做出些许改变,例如创建一幅图,在图中创建一个绘图区域,在绘图区域中添加一条线等等。在matplotlib
  • Matplotlib.pyplot - 停用图中的轴。 /图形轴与子图轴重叠(Matplotlib.pyplot - Deactivate axes in figure. /Axis of figure overlap with axes of subplot)
    问题 %load_ext autoreload %autoreload 2 %matplotlib inline import numpy as np import datetime as dt import pickle import pandas as pd import datetime from datetime import timedelta, date from datetime import date as dt import math import os import matplotlib.pyplot as plt plt.style.use('ggplot') from pylab import plot,show from matplotlib import ticker from matplotlib.backends.backend_pdf import PdfPages import matplotlib.dates as mdates import pylab as pl x_min_global=datetime.date(2010,1, 1)- timedelta(days=180) x_max_global=datetime.date(2015,1, 1)+ timedelta(days=180) d = pd.DataFrame(0
  • 在plotly中添加组条形图作为子图(Adding group bar charts as subplots in plotly)
    问题 我想在plotly 中创建分组( barmode='group' )条形图子图。 现在的问题是 plotly 不会创建条形图作为跟踪。 而是将分组条形图创建为条形跟踪列表。 因此,我不知道如何创建包含分组条形图作为子图的图形(即使用figure.append_trace()添加分组条形图)。 例如,如何使用在此示例中创建的条形图创建子图: import plotly.plotly as py import plotly.graph_objs as go trace1 = go.Bar( x=['giraffes', 'orangutans', 'monkeys'], y=[20, 14, 23], name='SF Zoo' ) trace2 = go.Bar( x=['giraffes', 'orangutans', 'monkeys'], y=[12, 18, 29], name='LA Zoo' ) data = [trace1, trace2] layout = go.Layout( barmode='group' ) fig = go.Figure(data=data, layout=layout) plot_url = py.plot(fig, filename='grouped-bar') 回答1 是的! plot.ly 的新手并且遇到了这个问题
  • Matplotlib:使用与以前的轴相同的参数添加轴(Matplotlib: Adding an axes using the same arguments as a previous axes)
    问题 我想在两个不同的子图中绘制数据。 绘制后,我想回到第一个子图并在其中绘制另一个数据集。 但是,当我这样做时,会收到以下警告: MatplotlibDeprecationWarning:当前使用与以前的轴相同的参数添加轴现在会重用之前的实例。 在将来的版本中,将始终创建并返回一个新实例。 同时,通过向每个轴实例传递唯一的标签,可以抑制此警告,并确保将来的行为。 warnings.warn(消息,mplDeprecation,stacklevel = 1) 我可以用一个简单的代码来重现它: import matplotlib.pyplot as plt import numpy as np # Generate random data data = np.random.rand(100) # Plot in different subplots plt.figure() plt.subplot(1, 2, 1) plt.plot(data) plt.subplot(1, 2, 2) plt.plot(data) plt.subplot(1, 2, 1) # Warning occurs here plt.plot(data + 1) 关于如何避免此警告的任何想法? 我使用matplotlib 2.1.0。 看起来像这里一样的问题 回答1 这是一个很好的例子
  • Class6-Image Segmentation
    1.Graylevel Thresholding 作用:就是在灰度图中将灰度值小于阈值的像素保留,否则置为0. 实现代码: function[]=Graylevelthresholding() clear, clc, close all % Load test image img = imread('peter.png'); % Threshold level = 105; bwImg = img < level; holeImg = img .* uint8(bwImg); % Show images subplot(1, 3, 1), imshow(img); title('Original Image'); subplot(1, 3, 2), imshow(bwImg); title('Thresholded Image'); subplot(1, 3, 3), imshow(holeImg); title('Binary Map \times Original'); % Save images imwrite(bwImg, 'Graylevel_Thresholding_thresholded.png'); imwrite(holeImg, 'Graylevel_Thresholding_blend.png'); 在ppt中,提了一个问题就是如何将图二的黑洞填上?
  • 如何在Tensorboard中显示自定义图像(例如Matplotlib图)?(How to Display Custom Images in Tensorboard (e.g. Matplotlib Plots)?)
    问题 Tensorboard自述文件的Image Dashboard部分显示: 由于图像仪表板支持任意png,因此您可以使用它将自定义可视化效果(例如matplotlib散点图)嵌入到TensorBoard中。 我看到了如何将pyplot图像写入文件,作为张量读回,然后与tf.image_summary()一起使用以将其写入TensorBoard,但是自述文件中的此语句表明有一种更直接的方法。 有没有? 如果是这样,是否还有其他文档和/或有效执行此操作的示例? 回答1 如果将图像保存在内存缓冲区中,这很容易做到。 下面,我显示一个示例,其中将pyplot保存到缓冲区,然后转换为TF图像表示形式,然后将其发送到图像摘要。 import io import matplotlib.pyplot as plt import tensorflow as tf def gen_plot(): """Create a pyplot plot and save to buffer.""" plt.figure() plt.plot([1, 2]) plt.title("test") buf = io.BytesIO() plt.savefig(buf, format='png') buf.seek(0) return buf # Prepare the plot plot_buf = gen
  • Matplotlib - adding subplots to a subplot?
    I'm trying to create a figure that consists of a 2x2 grid, where in each quadrant there are 2 vertically stacked subplots (i.e. a 2x1 grid). I can't seem to figure out how to achieve this, though. The closest I've gotten is using gridspec and some ugly code (see below), but because gridspec.update(hspace=X) changes the spacing for all of the subplots I'm still not where I'd like to be. Ideally what I want is to, using the picture below as an example, decrease the spacing between the subplots within each quadrant, while increasing the vertical spacing between the top and bottom quadrants (i.e
  • 我如何适合长标题?(How do I fit long title?)
    问题 还有一个类似的问题-但我无法使在那里提出的解决方案起作用。 这是一个带有长标题的示例情节: #!/usr/bin/env python import matplotlib import matplotlib.pyplot import textwrap x = [1,2,3] y = [4,5,6] # initialization: fig = matplotlib.pyplot.figure(figsize=(8.0, 5.0)) # lines: fig.add_subplot(111).plot(x, y) # title: myTitle = "Some really really long long long title I really really need - and just can't - just can't - make it any - simply any - shorter - at all." fig.add_subplot(111).set_title("\n".join(textwrap.wrap(myTitle, 80))) # tight: (matplotlib.pyplot).tight_layout() # saving: fig.savefig("fig.png") 它给出了 AttributeError: 'module'
  • Matplotlib global legend for lots of subplots
    i have some problem figuring out how to force matplotlib to add a legend where i want. The figures i currently have look like this: I generate this 2 paged plot with the following script: n = 1 trn = True for i in diff.keys(): plt.subplot(8, 4, n) plt.xlim([0, rounds + 1]) plt.locator_params(axis='y', nbins=5) if PEPTIDE_KD[i] == 1e-2: plt.plot(x_cord, [x[0] for x in diff[i]], 'ro--', label='asd') plt.plot(x_cord, [x[1] for x in diff[i]], 'rv--', label='bsd') else: plt.plot(x_cord, [x[0] for x in diff[i]], 'bo--', label='asd') plt.plot(x_cord, [x[1] for x in diff[i]], 'bv--', label='csd') plt
  • python2.7图像局部增强_python库skimage 实现图像直方图全局均衡化、局部均衡化
    """ ============================ Local Histogram Equalization ============================ This example enhances an image with low contrast, using a method called *local histogram equalization*, which spreads out the most frequent intensity values in an image. The equalized image has a roughly linear cumulative distribution function for each pixel neighborhood. The local version of the histogram equalization emphasized every local graylevel variations. """ import numpy as np import matplotlib import matplotlib.pyplot as plt from skimage import data from skimage.util.dtype import dtype_range