Добавить colorbar к осям и сохранить размер [dублировать]

Ответа на этот вопрос OP

Я следил за wiki

TestDisk 7.0, Data Recovery Utility, April 2015
Christophe GRENIER <grenier@cgsecurity.org>

Disk /dev/sdc - 124 GB / 115 GiB - CHS 15102 255 63
Partition               Start        End    Size in sectors
No partition found or selected for recovery

Но этот инструмент testdisk, без сомнения, most awesome. В главном меню я выбрал «Дополнительно» и продолжил, все файлы появились, и я скопировал их на внутренний диск. Я сказал, что этот инструмент потрясающий :).

Copying, please wait... 2 ok, 0 failed
Directory /media/sda
>drwxr-xr-x     0     0      4096 17-Jun-2016 15:13 .
 drwxr-xr-x     0     0       100 17-Jun-2016 15:13 ..
 drwx------     0     0     16384 17-Jun-2016 15:13 lost+found
153
задан 22 April 2015 в 00:16

4 ответа

Как указано в других ответах, идея, как правило, заключается в определении осей для цветной панели, в которой они находятся. Существуют различные способы сделать это; который еще не упоминался, заключался бы в прямом определении осей colorbar при создании подзадачи с помощью plt.subplots(). Преимущество состоит в том, что положение оси не нужно устанавливать вручную, и во всех случаях с автоматическим аспектом цветная панель будет точно такой же высоты, как и подзаголовки. Даже во многих случаях, когда используются изображения, результат будет удовлетворительным, как показано ниже.

При использовании plt.subplots() использование аргумента gridspec_kw позволяет сделать оси цветной панели намного меньшими, чем другие оси.

fig, (ax, ax2, cax) = plt.subplots(ncols=3,figsize=(5.5,3), 
                  gridspec_kw={"width_ratios":[1,1, 0.05]})

Пример:

import matplotlib.pyplot as plt
import numpy as np; np.random.seed(1)

fig, (ax, ax2, cax) = plt.subplots(ncols=3,figsize=(5.5,3), 
                  gridspec_kw={"width_ratios":[1,1, 0.05]})
fig.subplots_adjust(wspace=0.3)
im  = ax.imshow(np.random.rand(11,8), vmin=0, vmax=1)
im2 = ax2.imshow(np.random.rand(11,8), vmin=0, vmax=1)
ax.set_ylabel("y label")

fig.colorbar(im, cax=cax)

plt.show()

Это хорошо работает, если аспект сюжета автомасштабирован или изображения уменьшаются из-за их аспекта в направление ширины (как указано выше). Если, однако, изображения более широкие, но высокие, результат будет выглядеть следующим образом, что может быть нежелательным.

Решение по исправлению цветной панели высота до высоты подзаголовка должна была бы использовать mpl_toolkits.axes_grid1.inset_locator.InsetPosition для установки осей цветной панели относительно осей субплана изображения.

import matplotlib.pyplot as plt
import numpy as np; np.random.seed(1)
from mpl_toolkits.axes_grid1.inset_locator import InsetPosition

fig, (ax, ax2, cax) = plt.subplots(ncols=3,figsize=(7,3), 
                  gridspec_kw={"width_ratios":[1,1, 0.05]})
fig.subplots_adjust(wspace=0.3)
im  = ax.imshow(np.random.rand(11,16), vmin=0, vmax=1)
im2 = ax2.imshow(np.random.rand(11,16), vmin=0, vmax=1)
ax.set_ylabel("y label")

ip = InsetPosition(ax2, [1.05,0,0.05,1]) 
cax.set_axes_locator(ip)

fig.colorbar(im, cax=cax, ax=[ax,ax2])

plt.show()

enter image description here [!d5]

11
ответ дан 15 August 2018 в 16:11
  • 1
    Я не уверен, позволено ли мне спросить об этом здесь, но есть ли способ реализовать это решение, используя вместо этого ax = fig.add_subplot()? Я спрашиваю, потому что я не могу понять, как использовать его с базой. – lanadaquenada 23 May 2018 в 19:10
  • 2
    @lanadaquenada Да, это возможно, но в этом случае вам нужно будет поставить GridSpec в add_subplot(). – ImportanceOfBeingErnest 23 May 2018 в 19:16

Использование make_axes еще проще и дает лучший результат. Он также предоставляет возможности для настройки позиционирования цветной панели. Также обратите внимание на возможность subplots делиться осями x и y.

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

fig, axes = plt.subplots(nrows=2, ncols=2, sharex=True, sharey=True)
for ax in axes.flat:
    im = ax.imshow(np.random.random((10,10)), vmin=0, vmax=1)

cax,kw = mpl.colorbar.make_axes([ax for ax in axes.flat])
plt.colorbar(im, cax=cax, **kw)

plt.show()

34
ответ дан 15 August 2018 в 16:11
  • 1
    Этот метод не работает, если подзаголовок не является квадратным. Если вы измените nrows=1, цветная панель снова станет больше, чем подзаголовки. – Wesley Tansey 6 April 2015 в 03:41
  • 2
    Каковы ваши умолчания по умолчанию matplotlib? это выглядит здорово! – rafaelvalle 21 December 2017 в 00:00

Как новичок, который наткнулся на этот поток, я хотел бы добавить адаптацию python для манекенов очень аккуратного ответа abevieiramota (потому что я на том уровне, что мне нужно было искать «ravel», чтобы выработать что делает их код):

import numpy as np
import matplotlib.pyplot as plt

fig, ((ax1,ax2,ax3),(ax4,ax5,ax6)) = plt.subplots(2,3)

axlist = [ax1,ax2,ax3,ax4,ax5,ax6]

first = ax1.imshow(np.random.random((10,10)), vmin=0, vmax=1)
third = ax3.imshow(np.random.random((12,12)), vmin=0, vmax=1)

fig.colorbar(first, ax=axlist)

plt.show()

Гораздо меньше питонов, гораздо проще для noobs, подобных мне, чтобы посмотреть, что на самом деле происходит здесь.

6
ответ дан 15 August 2018 в 16:11
  • 1
    Ура! Я просто наткнулся на этот ответ, и я думаю, что это ценный вклад в сообщество SO. Спасибо, тонна @RChapman! – ericmjl 18 September 2017 в 17:04

Решение использования списка осей abevieiramota работает очень хорошо, пока вы не используете только один ряд изображений, как указано в комментариях. Использование разумного соотношения сторон для figsize помогает, но все еще далек от совершенства. Например:

import numpy as np
import matplotlib.pyplot as plt

fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(9.75, 3))
for ax in axes.flat:
    im = ax.imshow(np.random.random((10,10)), vmin=0, vmax=1)

fig.colorbar(im, ax=axes.ravel().tolist())

plt.show()

предоставляет параметр shrink, который является масштабным коэффициентом для размеров осей цветной панели. Это требует некоторых ручных проб и ошибок. Например:

fig.colorbar(im, ax=axes.ravel().tolist(), shrink=0.75)

1 x 3 image array [!d4]

81
ответ дан 15 August 2018 в 16:11
  • 1
    Это решение очень хорошо работало здесь и кажется самым простым. – Kknd 31 March 2015 в 21:36
  • 2
    Если вы меняете строки на 1, обе графики короче colorbar. так, как решить эту проблему? – Jin 19 July 2016 в 11:41
  • 3
    Двойной +1, это отличный подход – bizzy 9 September 2016 в 01:17
  • 4
    Жаль, что это не работает с tight_layout, но хорошее решение тем не менее. – Mark 15 December 2016 в 19:11
  • 5
    Действительно работает с tight_layout, но я понятия не имею, как добавить ярлык к этому цвету. Он не принимает ярлык kws, название, текст ... что угодно! И документы не очень помогают. – TomCho 22 July 2017 в 00:30
  • 6
    @TomCho Чтобы установить метку, вы можете захватить дескриптор colorbar при его создании, как: thecb = ax.cax.colorbar(im). Тогда вы можете сделать thecb.set_label_text("foo") – spinup 22 July 2017 в 07:06
  • 7
    Можете ли вы показать, как использовать этот параметр rect? – Chiel 8 August 2017 в 14:44
  • 8
    @Chiel Параметр rect указывает ограничительную рамку фигурных элементов с областью рисунка. Он принимает нормализованные координаты фигур, а по умолчанию - [0,0,1,1]. Поэтому указание rect=[0,0,0.9,1] в качестве аргумента tight_layout приведет к тому, что элементы фигуры, которые tight_layout будут знать, будут находиться в пределах 90% от ширины фигуры, оставив 10% для вашей метки. См. [D0] doc . – spinup 9 August 2017 в 22:56

Другие вопросы по тегам:

Похожие вопросы: