Составление таблицы в позициях утиков - PullRequest
0 голосов
/ 28 сентября 2018

У меня были проблемы с попыткой найти способ отображения списка из 3 элементов в форме таблицы.Что меня действительно волнует, так это рисование стола.Я хотел бы нарисовать таблицу 1by3 для каждого ylabel в заговоре.

Ниже приведено то, что я имею до сих пор.Если я смогу показать каждый экземпляр таблицы, у меня будет то, что я хочу.Прямо сейчас появляется ссылка на таблицу, и я не знаю почему.Если вы действительно посмотрите в центре слева, где появляются эталонные местоположения, вы увидите одну таблицу 1by3.

Возможно ли использовать matplotlib для создания новой таблицы для каждого ylabel?Информация таблицы напрямую связана с каждой строкой гистограммы, поэтому важно, чтобы у меня был способ их выстраивания.

Число строк в гистограмме является динамическим, поэтому создание 1 таблицы для всей фигуры и попытка динамического выравнивания строк с соответствующей гистограммой является сложной проблемой.

    # initialize figure
    fig = plt.figure()
    gs = gridspec.GridSpec(1, 2, width_ratios=[2, 1])
    fig.set_size_inches(18.5, 10.5)
    ax = fig.add_subplot(gs[0])

    #excluded bar graph code

    # create ylabels
    for row in range(1,len(data)):
        ylabel = [str(data[row][0]),str(data[row][1]),str(data[row][2])]
        ylabels.append(ylabel)

    #attempting to put each ylabel in a 1by3 table to display
    pos = np.arange(0.5,10.5,0.5)
    axTables = [None] * len(ylabels)
    for x in range(0,len(ylabels)):
        axTables[x] = fig.add_subplot(gs[0])
        ylabels[x] = axTables[x].table(cellText=[ylabels[x]], loc='left')

locsy, labelsy = plt.yticks(pos,ylabels)

enter image description here

1 Ответ

0 голосов
/ 29 сентября 2018

Во-первых, yticks будет ожидать ввода текста, он не может обрабатывать другие объекты.Во-вторых, стол должен сидеть в осях.

Таким образом, чтобы получить таблицу в позиции галочки (метки), идея может быть создать оси в позиции y ticklabel .Опцией является использование mpl_toolkits.axes_grid1.inset_locator.inset_axes.Теперь трудность состоит в том, что эти оси должны быть расположены в координатах данных вдоль оси y, а также в цифрах (или пикселях), расположенных в горизонтальном направлении.Для этого можно использовать смешанное преобразование.inset_axes позволяет задавать ширину и высоту в абсолютных единицах (в дюймах) или в относительных единицах, что удобно, поскольку мы можем установить ширину осей равной 100% ограничивающей рамки, в то время как высота все еще является некоторой абсолютной величиной(мы не хотим, чтобы высота осей зависела от координат данных!).Далее функция ax_at_posy создает такие оси.

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

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1.inset_locator import inset_axes
import matplotlib.transforms as mtrans

# General helper function to create an axes at the position of a yticklabel
def ax_at_posy(y, ax=None, width=0.3, leftspace=0.08, height=0.2):
    ax = ax or plt.gca()
    trans = mtrans.blended_transform_factory(ax.figure.transFigure, ax.transData)
    axins = inset_axes(ax, "100%", height, 
                       bbox_to_anchor=(leftspace, y, width-leftspace, 0.05),
                       bbox_transform=trans, loc="center right", borderpad=0.8)
    axins.tick_params(left=False, bottom=False, labelleft=False, labelbottom=False)
    axins.axis("off")
    return axins


fig, ax = plt.subplots()
fig.subplots_adjust(left=0.4)

ax.scatter(np.random.rand(30), np.random.randint(7, size=30), c=np.random.rand(30))

get_data = lambda i: "".join(np.random.choice(list("abcdefgxyzt0"), size=i+2))
data = np.vectorize(get_data)(np.random.randint(2,6,size=(7,3)))

for i, row in enumerate(data):
    axi = ax_at_posy(i, ax=ax, width=0.4)
    tab = axi.table(cellText=[list(row)], loc='center', bbox=(0,0,1,1))
    tab.auto_set_font_size(False)
    tab.set_fontsize(9)
    plt.setp(tab.get_celld().values(), linewidth=0.72)

plt.show()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...