rinrin
rinrin

Reputation: 325

Putting one color bar for several subplots from different dataframes

I looked everywhere and nothing really helped. Here is my code:

fig = plt.figure(figsize=(12, 6))
marker_colors = pca_data2['Frame']
fig.suptitle('PCA')

plt.subplot(1, 2, 1)
x = pca_data2.PC_1
y = pca_data2.PC_2
plt.scatter(x, y, c = marker_colors, cmap = "inferno")
plt.colorbar()

plt.subplot(1, 2, 2)
x1 = pca_data.PC_1
y1 = pca_data.PC_2
plt.scatter(x1, y1, c = marker_colors, cmap = "inferno")
plt.colorbar()

plt.show()

pca_data and pca_data2 are two completely different dataframes from to completele different things. But I need them side by side with the 1 color bar being on the right side for all.

Thats how the figure looks likeenter image description here

When I try to remove the first plt.colorbar() then the two subplots look uneven. I would really appreciate the help.

Upvotes: 0

Views: 661

Answers (3)

raphael
raphael

Reputation: 2980

... since none of the answers seems to mention the fact that you can tell the colorbar the axes on which it should be drawn... here's a simple example how I would do it:

The benefits of this are:

  • it's much clearer to read
  • you have complete control over the size of the colorbar
  • you can extend this easily to any grid of subplots and any position of the colorbar
import numpy as np    
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec
# generate some data
data, data1 = np.random.rand(10,10), np.random.rand(10,10)
x, y = np.meshgrid(np.linspace(0,1,10), np.linspace(0,1,10))

# initialize a plot-grid with 3 axes (2 plots and 1 colorbar)
gs = GridSpec(1, 3, width_ratios=[.48,.48,.04])

# set vmin and vmax explicitly to ensure that both colorbars have the same range!
vmin = np.min([np.min(data), np.min(data1)])
vmax = np.max([np.max(data), np.max(data1)])

plot_kwargs = dict(cmap = "inferno", vmin=vmin, vmax=vmax)

fig = plt.figure(figsize=(12, 6))
ax_0 = fig.add_subplot(gs[0], aspect='equal')
ax_1 = fig.add_subplot(gs[1], aspect='equal')
ax_cb = fig.add_subplot(gs[2])


s1 = ax_0.scatter(x, y, c = data, **plot_kwargs)
s2 = ax_1.scatter(x, y, c = data1, **plot_kwargs)

plt.colorbar(s1, cax=ax_cb)

enter image description here

Upvotes: 2

runDOSrun
runDOSrun

Reputation: 11005

You can use aspect to set a fixed aspect ratio on the subplots. Then append the colorbars to the right side of each axis and discard the first colorbar, to get an even layout:

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.axes_grid1 import make_axes_locatable

fig = plt.figure(figsize=(12, 6))
marker_colors = range(0,10)

x = x1 = np.random.randint(0,10,10)
y = y1 = np.random.randint(0,10,10)

ax1 = fig.add_subplot(1, 2, 1, aspect="equal") # or e.g. aspect=0.9
g1 = ax1.scatter(x, y, c = marker_colors, cmap = "inferno", )

ax2 = fig.add_subplot(1, 2, 2, aspect="equal") # or e.g. aspect=0.9
g2 = ax2.scatter(x1, y1, c = marker_colors, cmap = "inferno")

# put colorbars right next to axes
divider1 = make_axes_locatable(ax1)
cax1 = divider1.append_axes("right", size="5%", pad=0.05)

divider2 = make_axes_locatable(ax2)
cax2 = divider2.append_axes("right", size="5%", pad=0.05)

# reserve space for 1st colorbar, then remove
cbar1 = fig.colorbar(g1, cax=cax1)
fig.delaxes(fig.axes[2])

# 2nd colorbar
cbar2 = fig.colorbar(g2, cax=cax2)

plt.tight_layout()

plt.show()

If you want a different aspect ratio, you can modify aspect, e.g. to aspect=0.9. The result will have locked aspect ratios for the subplots, even if you resize the figure box:

result

Upvotes: 0

Imran_Say
Imran_Say

Reputation: 142

use following code: Hope it will match your problem statment.

fig = plt.figure(figsize=(12, 6))
marker_colors = range(0,10)

x=x1=np.random.randint(0,10,10)
y=y1=np.random.randint(0,10,10)

plt.subplot(1, 2, 1)
g1=plt.scatter(x, y, c = marker_colors, cmap = "inferno")


plt.subplot(1, 2, 2)
g2=plt.scatter(x1, y1, c = marker_colors, cmap = "inferno")

g11=plt.colorbar(g1)
g12=plt.colorbar(g2)

g11.ax.set_title('g1')
g12.ax.set_title('g2')

Upvotes: -1

Related Questions