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