我一直难以尝试找到一种以表格形式显示3元素列表的方法。我真正关心的是绘制表格。我想为图中的每个ylabel绘制一个1by3表。
以下是我到目前为止的内容。如果我可以显示每个Table实例,那么我将拥有所需的内容。现在出现了对表的引用,但我不确定为什么。如果您实际上是在参考位置出现的左中角,则可以看到一张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)
答案 0 :(得分:1)
首先,yticks
将以文本作为输入,它不能处理其他对象。其次,桌子需要坐在一个轴内。
因此,为了在刻度(标签)位置获得表格,可以在y刻度标签位置创建坐标轴。一种选择是使用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()