Размещение одной цветовой полосы для нескольких вложенных графиков из разных фреймов данных

#python #pandas #matplotlib

#python #панды #matplotlib

Вопрос:

Я искал везде, и ничего не помогло. Вот мой код:

 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 и pca_data2 — это два совершенно разных фрейма данных, которые завершают разные вещи. Но мне нужно, чтобы они были рядом, а 1 цветная полоса находилась справа для всех.

Вот как выглядит эта фигуравведите описание изображения здесь

Когда я пытаюсь удалить первый plt.colorbar(), то два подзаголовка выглядят неравномерно. Я был бы очень признателен за помощь.

Комментарии:

1. «два вложенных графика выглядят неравномерно»: не могли бы вы быть более конкретными?

2. @runDOSrun Я имею в виду, что когда я удаляю первый plt.colorbar() ниже x и y, тогда первый график растягивается, а второй график немного сжимается, что делает их неровными. Я пытаюсь построить график так, чтобы все графики выглядели даже с одной цветовой полосой

Ответ №1:

… поскольку ни в одном из ответов, похоже, не упоминается тот факт, что вы можете указать цветовой полосе оси, на которых она должна быть нарисована… вот простой пример того, как я бы это сделал:

Преимущества этого:

  • это намного понятнее для чтения
  • у вас есть полный контроль над размером цветовой полосы
  • вы можете легко распространить это на любую сетку вложенных графиков и любую позицию цветовой панели
 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)
 

введите описание изображения здесь

Ответ №2:

Вы можете использовать aspect для установки фиксированного соотношения сторон на вложенных графиках. Затем добавьте цветовые полосы с правой стороны каждой оси и удалите первую цветовую полосу, чтобы получить равномерный макет:

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

Если вы хотите другое соотношение сторон, вы можете изменить aspect , например, на aspect=0.9 . Результат будет иметь фиксированные пропорции для вложенных графиков, даже если вы измените размер окна рисунка:

Результат

Ответ №3:

используйте следующий код: надеюсь, он будет соответствовать вашему описанию проблемы.

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