Множественный захват и осанка (как показано) [дубликат]

Конечно, существует некоторый риск для безопасности с помощью JavaScript на мобильных телефонах - если бы этого не было, вы могли бы быть уверены, что настольные браузеры будут иметь такую ​​же безопасность! Но у мобильных пользователей, скорее всего, есть JavaScript, потому что, особенно на iPhone, он должен стоять за функциональность Flash или Silverlight. JS также используется для обеспечения аутентичных межфаковых элементов управления для веб-приложений и, следовательно, имеет еще большую добавленную стоимость.

Конечно, он идеален для поддержки пользователей без JavaScript. Если это возможно, вы должны абсолютно стремиться к этому, если динамические взаимодействия не являются настолько неотъемлемыми для вашей службы, что вы не можете этого избежать.

163
задан ali_m 21 April 2015 в 21:16
поделиться

8 ответов

Просто поместите цветную панель на свою собственную ось и используйте subplots_adjust, чтобы освободить место.

В качестве быстрого примера:

import numpy as np
import matplotlib.pyplot as plt

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

fig.subplots_adjust(right=0.8)
cbar_ax = fig.add_axes([0.85, 0.15, 0.05, 0.7])
fig.colorbar(im, cax=cbar_ax)

plt.show()

enter image description here [/g0]

224
ответ дан Joe Kington 15 August 2018 в 19:03
поделиться
  • 1
    Потрясающие! Большое спасибо за помощь. – astromax 10 December 2012 в 01:35
  • 2
    ImageGrid также очень полезен для этой цели. – Phillip Cloud 18 April 2013 в 00:37
  • 3
    если вам нужно использовать tight_layout (), вы захотите сделать все после subplots_adjust после tight_layout, а затем настроить координаты для subplots_adjust и add_axes вручную. – user1748155 26 September 2013 в 23:08
  • 4
    Как я могу иметь одну цветную полосу для двух разных графиков рассеяния, которые у меня уже есть? Я попытался выше, но я не знаю, как заменить & im? с соответствующими переменными. Пусть говорят, что мои диаграммы рассеяния являются plot1 = pylib.scatter (x, y, z) и plot2 = pylib.scatter (a, b, c) – Rotail 29 July 2014 в 02:57
  • 5
    Это могло быть очевидно для других, но я хотел бы указать, что для того, чтобы colourbar точно отображал цвет во всех графиках, аргументы vmin и vmax являются критическими. Они контролируют цветовой диапазон каждого подзаголовка. Если у вас есть реальные данные, вам может понадобиться пройти через это, чтобы сначала найти значения min и max. – kungfujam 3 September 2015 в 10:01

Как указано в других ответах, идея, как правило, заключается в определении осей для цветной панели, в которой они находятся. Существуют различные способы сделать это; который еще не упоминался, заключался бы в прямом определении осей 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()

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

[/g0]

34
ответ дан kch 15 August 2018 в 19:03
поделиться
  • 1
    Этот метод не работает, если подзаголовок не является квадратным. Если вы измените nrows=1, цветная панель снова станет больше, чем подзаголовки. – Wesley Tansey 6 April 2015 в 00:41
  • 2
    Каковы ваши умолчания по умолчанию matplotlib? это выглядит здорово! – rafaelvalle 20 December 2017 в 21: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()

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

6
ответ дан RChapman 15 August 2018 в 19:03
поделиться
  • 1
    Ура! Я просто наткнулся на этот ответ, и я думаю, что это ценный вклад в сообщество SO. Спасибо, тонна @RChapman! – ericmjl 18 September 2017 в 14: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()

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

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

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

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