2017-05-26 16 views
0

Ich habe eine Funktion, die ein Matplotlib.image.AxesImage Objekt zurückgibt und ich möchte zwei dieser Objekte nebeneinander in der gleichen Abbildung darstellen. Ich habe versucht, so etwas wie diese:Plot zwei matplotlib.image.AxesImage Objekte nebeneinander in Jupyter Notebook

fig, (ax1, ax2) = plt.subplots(ncols=2) 
ax1 = function_that_returns_AxesImage(some_arguments) # tried to reassign ax1 
ax2 = function_that_returns_AxesImage(other_arguments) # tried to reassign ax2 

jedoch, dass produziert nur eine Figur mit zwei leeren Nebenhandlungen und die beiden Grundstücke Ich möchte in einer Spalte aufgetragen, und nicht nebeneinander (see current plots output here). Mein Problem ist, dass ich die Funktion_that_returns_axes verwenden muss, und ich weiß nicht, wie die zurückgegebenen Plots in Unterplots versetzt werden. Alternativ könnte das auch funktionieren, wenn ich in Jupyter nur zwei Figuren nebeneinander darstellen könnte.

+0

Ich denke, dass wir mehr Informationen über 'function_that_returns_axes' benötigen. Es scheint, dass es tatsächlich einen Teil des Codes berücksichtigt, ansonsten würde es nicht auf die gleiche existierende Figur übertragen. Woher kommt diese Funktion? Hast du es selbst geschrieben? Kannst du einen Link dazu geben? – ImportanceOfBeingErnest

+0

@ImportanceOfBeingErnest Sicher, ich arbeite mit der Galpy-Bibliothek [https://github.com/jobovy/galpy.git](https://github.com/jobovy/galpy.git). Die spezielle Funktion ist die Plot-Funktion in galpy/galpy/potential_src/Potential.py. Danke für Ihre Hilfe! –

+0

Funktioniert meine Antwort von unten für Sie oder nicht? Wenn das der Fall ist, würde ich nicht tief in den Galpy-Code schauen müssen. – ImportanceOfBeingErnest

Antwort

0

Eine Lösung natürlich hängt davon ab, was genau function_that_returns_axes tut, um die Zahl. Aber wie es scheint, berücksichtigt es eine existierende Figur und gibt die Achsen zurück, auf die es geplottet hat.

Dann könnte man diese Achsen nehmen und ihre Position ändern, so dass sie auf einem benutzerdefinierten Raster lebt. Das Gitter würde über matplotlib.gridspec erstellt werden.

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.gridspec as gridspec 

fig = plt.figure() 

def function_that_returns_axes(l="A"): 
    ax = fig.add_subplot(111, label=l) 
    ax.plot(np.random.rand(5)) 
    return ax 

ax1 = function_that_returns_axes("A") 
ax2 = function_that_returns_axes("B") 

gs = gridspec.GridSpec(1,2) 
ax1.set_position(gs[0].get_position(fig)) 
ax1.set_subplotspec(gs[0]) 

ax2.set_position(gs[1].get_position(fig)) 
ax2.set_subplotspec(gs[1]) 

plt.show() 

enter image description here

Da beide Achsen nebeneinander sind, gesehen werden können, auch wenn sie zunächst auf der jeweils anderen von der function_that_returns_axes erstellt wurden.

Wenn die Funktion eine Achse nicht zurück, sondern ein Bild, wäre die Lösung wie folgt:

def function_that_returns_image(l="A"): 
    ax = fig.add_subplot(111, label=l) 
    im = ax.imshow(np.random.rand(5,5)) 
    return im 

im1 = function_that_returns_image("A") 
im2 = function_that_returns_image("B") 

ax1 = im1.axes 
ax2 = im2.axes 

# the rest being the same as above... 

enter image description here

0

Wenn Sie nicht ax1, ax2-function_that_returns_axes passieren kann, dann können Sie folgenden Code verwenden:

def align_figures(): 
    import matplotlib 
    from matplotlib._pylab_helpers import Gcf 
    from IPython.display import display_html 
    import base64 
    from ipykernel.pylab.backend_inline import show 

    images = [] 
    for figure_manager in Gcf.get_all_fig_managers(): 
     fig = figure_manager.canvas.figure 
     png = get_ipython().display_formatter.format(fig)[0]['image/png'] 
     src = base64.encodebytes(png).decode() 
     images.append('<img style="margin:0" align="left" src="data:image/png;base64,{}"/>'.format(src)) 

    html = "<div>{}</div>".format("".join(images)) 
    show._draw_called = False 
    matplotlib.pyplot.close('all') 
    display_html(html, raw=True) 

Für Detail: Jupyter Notebook: Output image in previous line