How to display two figures, side by side, in a Jupyter cell

Question:

import pandas as pd
import seaborn as sns

# load data
df = sns.load_dataset('penguins', cache=False)

sns.scatterplot(data=df, x='bill_length_mm', y='bill_depth_mm', hue='sex')
plt.show()
sns.scatterplot(data=df, x='flipper_length_mm', y='body_mass_g', hue='sex')
plt.show()

When I draw two plots with seaborn, in one cell, in jupyter, I get this view:

enter image description here

I want to draw the plots, side by side, like this:

plot1 plot2

How I should do this?

Updated:

Not two plots on one figure, but two plots on two separate figures.

  • This is not the solution being sought, because it’s two plots on one figure.
fig, ax = plt.subplots(1,2)
sns.plotType(someData, ax=ax[0])  # plot1
sns.plotType(someData, ax=ax[1])  # plot2
fig.show()
  • The solutions from the proposed duplicate ipython notebook arrange plots horizontally, do not work
    • The option with %html causes the figures to plot on top of each other
    • Additionally, other options were for ipython, not Jupyter, or recommended creating subplots..
Asked By: dasfex

||

Answers:

  • Markdown seems to be the easiest option because it does not require loading any additional packages, nor does it require multiple lines of code.
  • This question is about displaying two figures, side by side.
    • Separate figures, side by side, executed from a code cell, does not work.
  • You will need to create separate figures, and then use plt.savefig('file.jpg') to save each figure to a file.
  • Tested with jupyterlab v4.1.4, ipython v8.2.0, ipywidgets v8.1.2
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# load data
df = sns.load_dataset('penguins', cache=False)

# create and save figure
sns.scatterplot(data=df, x='bill_length_mm', y='bill_depth_mm', hue='sex')
plt.savefig('bill.jpg')
plt.close()  # prevents figure from being displayed when code cell is executed

# create and save new figure
sns.scatterplot(data=df, x='flipper_length_mm', y='body_mass_g', hue='sex')
plt.savefig('flipper.jpg')
plt.close()  # prevents figure from being displayed when code cell is executed

Markdown

  • Once the figures are saved to a file, they can be displayed side by side, by loading them in a markdown cell.
    • If the images are to large, the second figure will go to a new line.
  • Like this answer without being a table.
**Bill**: ![](bill.jpg)  **Flipper**: ![](flipper.jpg)

enter image description here

  • Then execute the cell

enter image description here


Other Options

HTML and IPython.display

from IPython.display import display, HTML

display(HTML(f"<table><tr><td><img src='bill.jpg'></td><td><img src='flipper.jpg'></td></tr></table>"))

enter image description here

ipywidgets and IPython.display

import ipywidgets as widgets
import IPython.display as display

# read the image files
img1 = open('bill.jpg', 'rb').read()
img2 = open('flipper.jpg', 'rb').read()

# create the image widgets
widget1 = widgets.Image(value=img1, format='jpeg')
widget2 = widgets.Image(value=img2, format='jpeg')

# create a box widget for the image widgets
box = widgets.Box([widget1, widget2])

# display box
display(box)

enter image description here

imshow

  • Read the images directly with matplotlib and display them with imshow, but the plot axis must also be set to off.
# read images
img_A = mpimg.imread('bill.jpg')
img_B = mpimg.imread('flipper.jpg')

# create the subplot axis
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(11, 8))

# plot the images
ax1.imshow(img_A)
ax2.imshow(img_B)

# turn of the axis
ax1.axis('off')
_ = ax2.axis('off')
  • axis on

enter image description here

  • axis off

enter image description here

Answered By: Trenton McKinney