天道酬勤,学无止境

How to create an arbitrary number of subplots in Julia Plots

I want to make a set of subplots from a multidimensional array using Breloff's Julia Plots. This plot function takes a varargs input and makes them into subplots, but I can't seem to feed my array in properly and am probably overlooking something simple. For example with an array a:

a = randn(5,5,8)
a = a.-mean(a)
a = a./maximum(extrema(a))

If I want to plot some of the 5x5 slices as heatmaps, I can do:

plot(heatmap(a[:,:,1], aspect_ratio=:equal, clims=(-1,1), title=string(1)), 
heatmap(a[:,:,2], aspect_ratio=:equal, clims=(-1,1), title=string(2)),
heatmap(a[:,:,3], aspect_ratio=:equal, clims=(-1,1), title=string(3)))

which produces:

but if I want to do all eight (or a variable number which is my goal), I can't make it work with a loop or a splat. I tried the latter to create a tuple but got an error:

plot(tuple([heatmap(a[:,:,i], aspect_ratio=:equal, clims=(-1,1)) for i in 1:8]...))

LoadError: MethodError: Cannot `convert` an object of type String to an object of type MethodError
This may have arisen from a call to the constructor MethodError(...),
since type constructors fall back to convert methods.
while loading In[1], in expression starting on line 1

What is the best approach here?

评论

I think the easiest way here is to make the separate plots and then put them together in a final plot. You can make an array of plots in a loop:

plot_array = Any[] # can type this more strictly
for i in 1:n
  push!(plot_array,plot(...)) # make a plot and add it to the plot_array
end
plot(plot_array...)

this works because the setup

p1 = plot(...)
p2 = plot(...)
plot(p1,p2)

creates a plot with subplots p1 and p2, and so we are just using that with an arbitrary amount of plots. You can also set layouts here, though that may be more difficult with arbitrary amounts.

受限制的 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>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 朱莉娅:如何将数据复制到朱莉娅中的另一个处理器(Julia: How to copy data to another processor in Julia)
    问题 如何在Julia中将数据从一个处理器移动到另一个处理器? 说我有一个数组 a = [1:10] 或其他一些数据结构。 将其放在所有其他可用处理器上的正确方法是什么,以使其以相同的变量名在这些处理器上可用? 回答1 一开始我不知道该怎么做,所以我花了一些时间弄清楚它。 这是我为传递对象而编写的一些函数: sendto 将任意数量的变量发送到指定的进程。 在指定过程的主模块中创建新变量。 名称将是关键字参数的键,而值将是关联的值。 function sendto(p::Int; args...) for (nm, val) in args @spawnat(p, eval(Main, Expr(:(=), nm, val))) end end function sendto(ps::Vector{Int}; args...) for p in ps sendto(p; args...) end end 例子 # creates an integer x and Matrix y on processes 1 and 2 sendto([1, 2], x=100, y=rand(2, 3)) # create a variable here, then send it everywhere else z = randn(10, 10); sendto(workers(), z=z)
  • 来自plt.subplots()的轴是一个“ numpy.ndarray”对象,没有属性“ plot”(Axes from plt.subplots() is a “numpy.ndarray” object and has no attribute “plot”)
    问题 如果您试图了解错误消息,则下面的信息可能是多余的。 请先阅读@ user707650的答案。 使用MatPlotLib,我想要一个可通用化的脚本,该脚本可从我的数据中创建以下内容。 包含子图的窗口,该子图的排列方式是每列b个子图。 我希望能够更改a和b的值。 如果我有2a个子图的数据,则需要2个窗口,每个窗口都有前面描述的“根据每列b个子图排列的一个子图”。 我正在绘制的x和y数据是存储在np.arrays中的浮点数,其结构如下: 所有图的x数据始终相同,且长度为5。 'x_vector': [0.000, 0.005, 0.010, 0.020, 0.030, 0.040] 所有图的y数据存储在y_vector中,其中第一个图的数据存储在索引0到5。第二个图的数据存储在索引6到11。第三个图的值为12-18,第四个图的值为19。 -24,依此类推。 总的来说,对于该数据集,我有91个图(即y_vector中存储的91 * 6 = 546个值)。 试图: import matplotlib.pyplot as plt # Options: plots_tot = 14 # Total number of plots. In reality there is going to be 7*13 = 91 plots. location_of_ydata = 6 # The
  • Parallel Coordinates plot in Matplotlib
    Two and three dimensional data can be viewed relatively straight-forwardly using traditional plot types. Even with four dimensional data, we can often find a way to display the data. Dimensions above four, though, become increasingly difficult to display. Fortunately, parallel coordinates plots provide a mechanism for viewing results with higher dimensions. Several plotting packages provide parallel coordinates plots, such as Matlab, R, VTK type 1 and VTK type 2, but I don't see how to create one using Matplotlib. Is there a built-in parallel coordinates plot in Matplotlib? I certainly don't
  • 如何在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
  • 子图如何工作?MATLAB中的子图(121)和子图(1,2,1)有什么区别?(How does subplot work and what is the difference between subplot(121) and subplot(1,2,1) in MATLAB?)
    问题 我subplot工作方式还不清楚。 具体来说,MATLAB中的subplot(121)和subplot(1,2,1)什么区别? 我试图搜索subplot文档,但是似乎找不到我想要的东西。 回答1 长话短说,没有区别。 subplot工作方式如下: subplot(m,n,p); %//or subplot(mnp); 您在subplot中使用了三个数字。 subplot将多个图形放置在同一窗口中。 您可以将图放置在mxn网格内,其中m包含图中的行数, n包含图中的列数。 p决定了要放置在网格中的情节。 数p从1增加到mxn ,并且图从左到右,从上到下放置。 在这种情况下,当执行subplot(1,2,1); 或subplot(121); 你想有一个行和两个价值的数字。 最后一个数字p=1表示您希望将图放置在最左侧的列中。 当你做subplot(1,2,2); 或subplot(122); ,这是当p=2 ,您希望将图放置在最右边的列中。 subplot使用方式如下: 首先确定要在此窗口中绘制多少行和多少列(即m和n )。 产生一个空白的figure窗口对于要创建的每个图... 调用subplot然后选择要在其中显示subplot的正确位置。 编写必要的代码来创建绘图,就像只占用一个窗口的绘图一样。 绘制数据对我们拥有的每个图重复步骤3,直到用完subplot插槽。
  • 如何使用matplotlib在单个页面上绘制多个图?(How to make several plots on a single page using matplotlib?)
    问题 我编写的代码可以一次打开16位数字。 目前,它们都以单独的图形打开。 我希望他们在同一页面上全部打开。 不一样的图。 我希望在单个页面/窗口上有16个独立的图。 同样由于某种原因,numbins和defaultreallimits的格式也无法保存在图1之上。是否需要使用subplot命令? 我不明白为什么我必须这样做,但不知道我还要做什么? import csv import scipy.stats import numpy import matplotlib.pyplot as plt for i in range(16): plt.figure(i) filename= easygui.fileopenbox(msg='Pdf distance 90m contour', title='select file', filetypes=['*.csv'], default='X:\\herring_schools\\') alt_file=open(filename) a=[] for row in csv.DictReader(alt_file): a.append(row['Dist_90m(nmi)']) y= numpy.array(a, float) relpdf=scipy.stats.relfreq(y, numbins=7
  • matplotlib.pyplot的全函数解释 API
    matplotlib.pyplot Pyplot功能概述 https://matplotlib.org/stable/api/pyplot_summary.html pyplot matplotlib.pyplot 是matplotlib的基于状态的接口。 matplotlib.pyplot.plotting()[资源] 功能 描述 acorr 绘制x的自相关。 angle_spectrum 绘制角度光谱。 annotate 用文本text注释点xy。 arrow 在轴上添加一个箭头。 autoscale 将轴视图自动缩放为数据(切换)。 axes 在当前图形上添加轴,使其成为当前轴。 axhline 在轴上添加一条水平线。 axhspan 在轴上添加水平跨度(矩形)。 axis 获取或设置某些轴属性的便捷方法。 axline 添加无限长的直线。 axvline 在轴上添加一条垂直线。 axvspan 在轴上添加垂直跨度(矩形)。 bar 绘制条形图。 bar_label 标记条形图。 barbs 绘制一个2D倒刺区域。 barh 绘制水平条形图。 box 打开或关闭当前轴上的轴框。 boxplot 制作一个盒子和晶须图。 broken_barh 绘制矩形的水平序列。 cla 清除当前轴。 clabel 标注等高线图。 clf 清除当前数字。 clim 设置当前图像的颜色限制。
  • 如何使用Python并排绘制两个图?(How to make two plots side-by-side using Python?)
    问题 我在matplotlib上找到了以下示例: import numpy as np import matplotlib.pyplot as plt x1 = np.linspace(0.0, 5.0) x2 = np.linspace(0.0, 2.0) y1 = np.cos(2 * np.pi * x1) * np.exp(-x1) y2 = np.cos(2 * np.pi * x2) plt.subplot(2, 1, 1) plt.plot(x1, y1, 'ko-') plt.title('A tale of 2 subplots') plt.ylabel('Damped oscillation') plt.subplot(2, 1, 2) plt.plot(x2, y2, 'r.-') plt.xlabel('time (s)') plt.ylabel('Undamped') plt.show() 我的问题是:为了使地块并排,我需要更改什么? 回答1 将子图设置更改为: plt.subplot(1, 2, 1) ... plt.subplot(1, 2, 2) subplot的参数为:行数,列数以及当前使用的子图。 所以1, 2, 1表示“一个1行,2列的数字:去第一次要情节。” 然后1, 2, 2装置“的1行,2列的图:去到第二副区”。 当前,您正在请求2行1列
  • Accessing backend specific functionality with Julia Plots
    Plots is simple and powerful but sometimes I would like to have a little bit more control over individual elements of the plot to fine-tune its appearance. Is it possible to update the plot object of the backend directly? E.g., for the default pyplot backend, I tried using Plots p = plot(sin) p.o[:axes][1][:xaxis][:set_ticks_position]("top") but the plot does not change. Calling p.o[:show]() afterwards does not help, either. In other words: Is there a way to use the PyPlot interface for a plot that was initially created with Plots? Edit: The changes to the PyPlot object become visible (also in
  • Axes from plt.subplots() is a “numpy.ndarray” object and has no attribute “plot”
    The information below may be superfluous if you are trying to understand the error message. Please start off by reading the answer by @user707650. Using MatPlotLib, I wanted a generalizable script that creates the following from my data. A window containing a subplots arranged so that there are b subplots per column. I want to be able to change the values of a and b. If I have data for 2a subplots, I want 2 windows, each with the previously described "a subplots arranged according to b subplots per column". The x and y data I am plotting are floats stored in np.arrays and are structured as
  • creating multiple scatter plots with same axes in R
    I'm trying to plot four scatter plots in 2 x 2 arrangement in R (I'm actually plotting via rpy2). I'd like each to have an aspect ratio of 1 but also be on the same scale, so identical X and Y ticks for all the subplots so that they can be compared. I tried to do this with par: par(mfrow=c(2,2)) # scatter 1 plot(x, y, "p", asp=1) # scatter 2 plot(a, b, "p", asp=1) # ... Edit: Here's a direct example of what I have now: > par(mfrow=c(2,2)) > for (n in 1:4) { plot(iris$Petal.Width, rnorm(length(iris$Petal.Width)), "p", asp=1) } which creates the right type of scatter but with different scales
  • 在matplotlib中动态添加/创建子图(Dynamically add/create subplots in matplotlib)
    问题 我想创建一个由共享x / y轴的几个子图组成的图。 从文档中看起来应该像这样(尽管我的子图将是散布图):(此处为代码) 但是我想动态创建子图! 因此,子图的数量取决于先前功能的输出。 (根据我的脚本的输入,每个图可能大约有3到15个子图,每个子图来自不同的数据集。) 谁能告诉我如何做到这一点? 回答1 import matplotlib.pyplot as plt from pylab import * import numpy as np x = np.linspace(0, 2*np.pi, 400) y = np.sin(x**2) subplots_adjust(hspace=0.000) number_of_subplots=3 for i,v in enumerate(xrange(number_of_subplots)): v = v+1 ax1 = subplot(number_of_subplots,1,v) ax1.plot(x,y) plt.show() 该代码有效,但是您需要更正轴。 我曾经使用subplot图在同一列中绘制3个图形。 您需要做的就是为number_of_plots变量分配一个整数。 如果每个图的X和Y值不同,则需要为每个图分配它们。 subplot工作方式如下,例如,如果我的子图值为3,1,1 。
  • I got a message “using Plots” in Julia and I do no how to resolve it
    I am a new in Julia and after adding the Plots package I tried to use Plots and I got this Error message: julia> using Plots [ Info: Precompiling Plots [91a5bcdd-55d7-5caf-9e0b-520d859cae80] ERROR: LoadError: InitError: could not load library "C:\Users\niri.julia\artifacts\7350a6401f1c0d38cc3518193083bc4f83adfe99\bin\avcodec-58.dll" The specified module could not be found. Stacktrace: ERROR: LoadError: Failed to precompile FFMPEG [c87230d0-a227-11e9-1b43-d7ebe4e7570a] to C:\Users\niri.julia\compiled\v1.5\FFMPEG\TGvga_Ik59J.ji. ERROR: Failed to precompile Plots [91a5bcdd-55d7-5caf-9e0b
  • Arrange plots that have subplots called from functions on grid in matplotlib
    I am looking for something similar to arrangeGrob in R: I have a function (say, function FUN1) that creates a plot with subplots. The number of subplots FUN1 creates may vary and the plot itself is quite complex. I have two other functions FUN2 and FUN3 which also create plots of varying structure. Is there a simple way to define/arrange an overall GRID, for example a simple 3 rows 1 column style and simply pass FUN1 --> GRID(row 1, col 1) FUN2 --> GRID(row 2, col 1) FUN3 --> GRID(row 3, col 1) afterwards such that the complicated plot generated by FUN1 gets plotted in in row 1, the plot
  • 如何在一个图中制作 10 个以上的子图?(How to make more than 10 subplots in a figure?)
    问题 我正在尝试制作一个 5x4 的子图网格,从查看示例来看,在我看来最好的方法是: import matplotlib.pyplot as plt plt.figure() plt.subplot(221) 其中子图 (22) 中的前两个数字表示它是一个 2x2 网格,第三个数字表示您正在制作的 4 个网格中的哪一个。 然而,当我尝试这个时,我不得不去: plt.subplot(5420) 我得到了错误: ValueError: Integer subplot specification must be a three digit number. Not 4 那么这是否意味着你不能制作超过 10 个子图,或者有没有办法解决它,或者我误解了它是如何工作的? 先感谢您。 回答1 您可能正在寻找 GridSpec。 您可以说明网格的大小 (5,4) 和每个图的位置(行 = 0,列 = 2,即 - 0,2)。 检查以下示例: import matplotlib.pyplot as plt plt.figure(0) ax1 = plt.subplot2grid((5,4), (0,0)) ax2 = plt.subplot2grid((5,4), (1,1)) ax3 = plt.subplot2grid((5,4), (2, 2)) ax4 = plt.subplot2grid((5
  • matplotlib:创建两个(堆叠的)具有共享X轴但单独Y轴值的子图(matplotlib: Creating two (stacked) subplots with SHARED X axis but SEPARATE Y axis values)
    问题 我在Ubuntu 10.0.4上使用matplotlib 1.2.x和Python 2.6.5。 我正在尝试创建一个由顶图和底图组成的单图。 X轴是时间序列的日期。 顶部图包含数据的烛台图,底部图应包含条形图-带有自己的Y轴(也在左侧-与顶部图相同)。 这两个图不应重叠。 这是我到目前为止所做的摘要。 datafile = r'/var/tmp/trz12.csv' r = mlab.csv2rec(datafile, delimiter=',', names=('dt', 'op', 'hi', 'lo', 'cl', 'vol', 'oi')) mask = (r["dt"] >= datetime.date(startdate)) & (r["dt"] <= datetime.date(enddate)) selected = r[mask] plotdata = zip(date2num(selected['dt']), selected['op'], selected['cl'], selected['hi'], selected['lo'], selected['vol'], selected['oi']) # Setup charting mondays = WeekdayLocator(MONDAY) # major ticks on the mondays
  • 在 matplotlib 中创建方形子图(高度和宽度相等)(Creating square subplots (of equal height and width) in matplotlib)
    问题 当我运行此代码时 from pylab import * figure() ax1 = subplot(121) plot([1, 2, 3], [1, 2, 3]) subplot(122, sharex=ax1, sharey=ax1) plot([1, 2, 3], [1, 2, 3]) draw() show() 我得到了两个在 X 维中被“压扁”的子图。 对于两个子图,如何获得这些子图,使 Y 轴的高度等于 X 轴的宽度? 我在 Ubuntu 10.04 上使用 matplotlib v.0.99.1.2。 2010-07-08 更新:让我们看看一些不起作用的东西。 在谷歌上搜索了一整天后,我认为这可能与自动缩放有关。 所以我试着摆弄它。 from pylab import * figure() ax1 = subplot(121, autoscale_on=False) plot([1, 2, 3], [1, 2, 3]) subplot(122, sharex=ax1, sharey=ax1) plot([1, 2, 3], [1, 2, 3]) draw() show() matplotlib 坚持自动缩放。 from pylab import * figure() ax1 = subplot(121, autoscale_on=False) plot([1
  • Parallelising gradient calculation in Julia
    I was persuaded some time ago to drop my comfortable matlab programming and start programming in Julia. I have been working for a long with neural networks and I thought that, now with Julia, I could get things done faster by parallelising the calculation of the gradient. The gradient need not be calculated on the entire dataset in one go; instead one can split the calculation. For instance, by splitting the dataset in parts, we can calculate a partial gradient on each part. The total gradient is then calculated by adding up the partial gradients. Though, the principle is simple, when I
  • 如何在我的情节周围放置更多空白?(How to put more whitespace around my plots?)
    问题 我有一个图形,其中包含两行一列中的两个子图,如下所示: fig, (ax1, ax2) = subplots( nrows=2, ncols=1, ) 两个子图是饼图,因此我希望它们的轴是方形的。 浏览API后,以下应该是调整每个子图轴的正确方法: ax1.axis([0, 8, 0, 8]) ax2.axis([0, 8, 0, 8]) 然后我调整整个图形的大小。 由于每个子图的宽度为 8 英寸,因此我将图形的宽度也设置为 8 英寸,将图形的高度设置为 2*8=16 英寸: fig.set_size_inches(8, 16) 这些设置会生成格式良好的饼图。 但是,当我将图形保存到 PDF 文件时,饼图的一个楔形的标签在图形的右边缘被切断。 保存的文件中的图形比预览窗口中的更窄。 这就是为什么我想沿 x 轴加宽图形但保留子图的轴。 如果我只是尝试通过执行以下操作来扩大数字: fig.set_size_inches(12, 16) 这个数字现在变得更宽了,但不幸的是,两个饼图也是如此。 根据我的理解, axis()调用应该保留子图的尺寸,但它们没有。 在阅读并尝试了很多关于 autoscale、xlim、ylim 等之后,我更加困惑,没有任何效果。 我只是想通过保留子图的尺寸来加宽图形,以便沿 x 轴有更多空白,并且可以在不切断标签的情况下显示标签。 我怎么做? 回答1
  • 在 Matplotlib 中,fig.add_subplot(111) 中的参数是什么意思?(In Matplotlib, what does the argument mean in fig.add_subplot(111)?)
    问题 有时我会遇到这样的代码: import matplotlib.pyplot as plt x = [1, 2, 3, 4, 5] y = [1, 4, 9, 16, 25] fig = plt.figure() fig.add_subplot(111) plt.scatter(x, y) plt.show() 其中产生: 我一直在疯狂地阅读文档,但找不到111的解释。 有时我会看到一个212 。 fig.add_subplot()的参数是什么意思? 回答1 这些是编码为单个整数的子图网格参数。 例如,“111”表示“1x1 网格,第一个子图”,“234”表示“2x3 网格,第四个子图”。 add_subplot(111)替代形式是add_subplot(1, 1, 1) 。 回答2 我认为这最好通过下图来解释: 要初始化上述内容,可以键入: import matplotlib.pyplot as plt fig = plt.figure() fig.add_subplot(221) #top left fig.add_subplot(222) #top right fig.add_subplot(223) #bottom left fig.add_subplot(224) #bottom right plt.show() 回答3 康斯坦丁的答案很明显,但是对于更多背景