# -*- coding: utf-8 -*-
import logging
import wbia.plottool.draw_func2 as df2
import numpy as np
from wbia.other import ibsfuncs
from wbia.plottool import plot_helpers as ph
import wbia.plottool as pt
import utool as ut
from wbia.viz import viz_chip
(print, rrr, profile) = ut.inject2(__name__)
logger = logging.getLogger('wbia')
[docs]def show_name_of(ibs, aid, **kwargs):
nid = ibs.get_annot_names(aid)
show_name(ibs, nid, sel_aids=[aid], **kwargs)
[docs]def testdata_showname():
import wbia
ibs = wbia.opendb(defaultdb='testdb1')
default = None
if ibs.dbname == 'testdb1':
default = 'easy'
name_text = ut.get_argval('--name', type_=str, default=default)
if name_text is None:
nid = 1
else:
nid = ibs.get_name_rowids_from_text(name_text)
in_image = not ut.get_argflag('--no-inimage')
index_list = ut.get_argval('--index_list', type_=list, default=None)
return ibs, nid, in_image, index_list
[docs]def testdata_multichips():
import wbia
ibs = wbia.opendb(defaultdb='testdb1')
nid = ut.get_argval('--nid', type_=int, default=None)
tags = ut.get_argval('--tags', type_=list, default=None)
if nid is not None:
aid_list = ibs.get_name_aids(nid)
elif tags is not None:
index = ut.get_argval('--index', default=0)
aid_list = ibs.filter_aidpairs_by_tags(any_tags=tags)[index]
else:
# aid_list = ut.get_argval('--aids', type_=list, default=[1, 2, 3])
aid_list = wbia.testdata_aids(default_aids=[1, 2, 3], ibs=ibs)
in_image = not ut.get_argflag('--no-inimage')
return ibs, aid_list, in_image
# 9108 and 9180
[docs]def show_multiple_chips(
ibs, aid_list, in_image=True, fnum=0, sel_aids=[], subtitle='', annote=False, **kwargs
):
"""
CommandLine:
python -m wbia.viz.viz_name --test-show_multiple_chips --show --no-inimage
python -m wbia.viz.viz_name --test-show_multiple_chips --show --db NNP_Master3 --aids=6435,9861,137,6563,9167,12547,9332,12598,13285 --no-inimage --notitle
python -m wbia.viz.viz_name --test-show_multiple_chips --show --db NNP_Master3 --aids=137,6563,12547,9332,12598,13285 --no-inimage --notitle --adjust=.05
python -m wbia.viz.viz_name --test-show_multiple_chips --show --db NNP_Master3 --aids=6563,9332,13285,12598 --no-inimage --notitle --adjust=.05 --rc=1,4
python -m wbia.viz.viz_name --test-show_multiple_chips --show --db PZ_Master0 --aids=1288 --no-inimage --notitle --adjust=.05
python -m wbia.viz.viz_name --test-show_multiple_chips --show --db PZ_Master0 --aids=4020,4839 --no-inimage --notitle --adjust=.05
python -m wbia.viz.viz_name --test-show_multiple_chips --db NNP_Master3 --aids=6524,6540,6571,6751 --no-inimage --notitle --adjust=.05 --diskshow
python -m wbia.viz.viz_name --test-show_multiple_chips --db PZ_MTEST -a default:index=0:4 --show
--aids=1 --doboth --show --no-inimage
python -m wbia.viz.viz_name --test-show_multiple_chips --db PZ_MTEST --aids=1 --doboth --show --no-inimage
python -m wbia.viz.viz_name --test-show_multiple_chips --db PZ_MTEST --aids=1 --doboth --rc=2,1 --show --no-inimage
python -m wbia.viz.viz_name --test-show_multiple_chips --db PZ_MTEST --aids=1 --doboth --rc=2,1 --show --notitle --trydrawline --no-draw_lbls
python -m wbia.viz.viz_name --test-show_multiple_chips --db PZ_MTEST --aids=1,2 --doboth --show --notitle --trydrawline
python -m wbia.viz.viz_name --test-show_multiple_chips --db PZ_MTEST --aids=1,2,3,4,5 --doboth --rc=2,5 --show --chrlbl --trydrawline --qualtitle --no-figtitle --notitle
--doboth
--doboth --show
python -m wbia.viz.viz_name --test-show_multiple_chips --db NNP_Master3 --aids=15419 --doboth --rc=2,1 --show --notitle --trydrawline --no-draw_lbls
Example:
>>> # DISABLE_DOCTEST
>>> from wbia.viz.viz_name import * # NOQA
>>> import wbia
>>> ibs, aid_list, in_image = testdata_multichips()
>>> if True:
>>> import matplotlib as mpl
>>> from wbia.scripts.thesis import TMP_RC
>>> mpl.rcParams.update(TMP_RC)
>>> fnum = 0
>>> sel_aids = []
>>> subtitle = ''
>>> annote = False
>>> fig = show_multiple_chips(ibs, aid_list, in_image, fnum, sel_aids, subtitle, annote)
>>> ut.quit_if_noshow()
>>> fig.canvas.draw()
>>> ut.show_if_requested()
"""
fnum = pt.ensure_fnum(fnum)
nAids = len(aid_list)
if nAids == 0:
fig = df2.figure(fnum=fnum, pnum=(1, 1, 1), **kwargs)
df2.imshow_null(fnum=fnum, **kwargs)
return fig
# Trigger computation of all chips in parallel
ibsfuncs.ensure_annotation_data(
ibs, aid_list, chips=(not in_image or annote), feats=annote
)
logger.info('[viz_name] * annot_vuuid=%r' % ((ibs.get_annot_visual_uuids(aid_list),)))
logger.info('[viz_name] * aid_list=%r' % ((aid_list,)))
DOBOTH = ut.get_argflag('--doboth')
rc = ut.get_argval('--rc', type_=list, default=None)
if rc is None:
nRows, nCols = ph.get_square_row_cols(nAids * (2 if DOBOTH else 1))
else:
nRows, nCols = rc
notitle = ut.get_argflag('--notitle')
draw_lbls = not ut.get_argflag('--no-draw_lbls')
show_chip_kw = dict(
annote=annote, in_image=in_image, notitle=notitle, draw_lbls=draw_lbls
)
# logger.info('[viz_name] * r=%r, c=%r' % (nRows, nCols))
# gs2 = gridspec.GridSpec(nRows, nCols)
pnum_ = df2.get_pnum_func(nRows, nCols)
fig = df2.figure(fnum=fnum, pnum=pnum_(0), **kwargs)
fig.clf()
ax_list1 = []
for px, aid in enumerate(aid_list):
logger.info('px = %r' % (px,))
_fig, _ax1 = viz_chip.show_chip(ibs, aid=aid, pnum=pnum_(px), **show_chip_kw)
logger.info('other_aids = %r' % (ibs.get_annot_contact_aids(aid),))
ax = df2.gca()
ax_list1.append(_ax1)
if aid in sel_aids:
df2.draw_border(ax, df2.GREEN, 4)
if ut.get_argflag('--chrlbl') and not DOBOTH:
ax.set_xlabel('(' + chr(ord('a') - 1 + px) + ')')
elif ut.get_argflag('--numlbl') and not DOBOTH:
ax.set_xlabel('(' + str(px + 1) + ')')
# plot_aid3(ibs, aid)
# HACK to show in image and not in image
if DOBOTH:
# ut.embed()
# ph.get_plotdat_dict(ax_list1[1])
# ph.get_plotdat_dict(ax_list2[1])
ax_list2 = []
show_chip_kw['in_image'] = not show_chip_kw['in_image']
start = px + 1
for px, aid in enumerate(aid_list, start=start):
_fig, _ax2 = viz_chip.show_chip(ibs, aid=aid, pnum=pnum_(px), **show_chip_kw)
ax = df2.gca()
ax_list2.append(_ax2)
if ut.get_argflag('--chrlbl'):
ax.set_xlabel('(' + chr(ord('a') - start + px) + ')')
elif ut.get_argflag('--numlbl'):
ax.set_xlabel('(' + str(px - start + 1) + ')')
if ut.get_argflag('--qualtitle'):
qualtext = ibs.get_annot_quality_texts(aid)
ax.set_title(qualtext)
if aid in sel_aids:
df2.draw_border(ax, df2.GREEN, 4)
if in_image:
ax_list1, ax_list2 = ax_list2, ax_list1
if ut.get_argflag('--trydrawline'):
# Unfinished
# ut.embed()
# Draw lines between corresponding axes
# References:
# http://stackoverflow.com/questions/17543359/drawing-lines-between-two-plots-in-matplotlib
import matplotlib as mpl
import vtool as vt
# !!!
# http://matplotlib.org/users/transforms_tutorial.html
# invTransFigure_fn1 = fig.transFigure.inverted().transform
# invTransFigure_fn2 = fig.transFigure.inverted().transform
# logger.info(ax_list1)
# logger.info(ax_list2)
assert len(ax_list1) == len(ax_list2)
for ax1, ax2 in zip(ax_list1, ax_list2):
# _ = ax1.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
# bbox1 = (0, 0, _.width * fig.dpi, _.height * fig.dpi)
# returns in figure coordinates
# bbox1 = df2.get_axis_bbox(ax=ax1)
# if bbox1[-1] < 0:
# # Weird bug
# bbox1 = bbox1[1]
logger.info('--')
logger.info('ax1 = %r' % (ax1,))
logger.info('ax2 = %r' % (ax2,))
chipshape = ph.get_plotdat(ax1, 'chipshape')
# _bbox1 = ax1.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
# bbox1 = (0, 0, _bbox1.width * fig.dpi, _bbox1.height * fig.dpi)
bbox1 = (0, 0, chipshape[1], chipshape[0])
aid_ = ph.get_plotdat(ax2, 'aid')
aid_list_ = ph.get_plotdat(ax2, 'aid_list')
index = aid_list_.index(aid_)
annotation_bbox_list = ph.get_plotdat(ax2, 'annotation_bbox_list')
bbox2 = annotation_bbox_list[index]
logger.info('bbox1 = %r' % (bbox1,))
logger.info('bbox2 = %r' % (bbox2,))
vert_list1 = np.array(vt.verts_from_bbox(bbox1))
vert_list2 = np.array(vt.verts_from_bbox(bbox2))
logger.info('vert_list1 = %r' % (vert_list1,))
logger.info('vert_list2 = %r' % (vert_list2,))
# for vx in [0, 1, 2, 3]:
for vx in [0, 1]:
vert1 = vert_list1[vx].tolist()
vert2 = vert_list2[vx].tolist()
logger.info(' ***')
logger.info(' * vert1 = %r' % (vert1,))
logger.info(' * vert2 = %r' % (vert2,))
coordsA = coordsB = 'data'
# coords = 'axes points'
# 'axes fraction'
# 'axes pixels'
# coordsA = 'axes pixels'
# coordsB = 'data'
# 'figure fraction'
# 'figure pixels'
# 'figure pixels'
# 'figure points'
# 'polar'
# 'offset points'
con = mpl.patches.ConnectionPatch(
xyA=vert1,
xyB=vert2,
coordsA=coordsA,
coordsB=coordsB,
axesA=ax1,
axesB=ax2,
linewidth=1,
color='k',
)
# , arrowstyle="-")
# ut.embed()
# con.set_zorder(None)
ax1.add_artist(con)
# ax2.add_artist(con)
# ut.embed()
# verts2.T[1] -= bbox2[-1]
# bottom_left1, bottom_right1 = verts1[1:3].tolist()
# bottom_left2, bottom_right2 = verts2[1:3].tolist()
# #transAxes1 = ax1.transData.inverted()
# transAxes1_fn = ax1.transData.transform
# transAxes2_fn = ax2.transData.transform
# transAxes1_fn = ut.identity
# transAxes2_fn = ut.identity
# coord_bl1 = transFigure.transform(transAxes1.transform(bottom_left1))
# coord_br1 = transFigure.transform(transAxes1.transform(bottom_right1))
# coord_bl1 = invTransFigure_fn1(transAxes1_fn(bottom_left1))
# logger.info('bottom_left2 = %r' % (bottom_left2,))
# coord_bl1 = (5, 5)
# coord_bl2 = invTransFigure_fn2(transAxes2_fn(bottom_left2))
# logger.info('coord_bl2 = %r' % (coord_bl2,))
# coord_br1 = invTransFigure_fn1(transAxes1_fn(bottom_right1))
# coord_br2 = invTransFigure_fn2(transAxes2_fn(bottom_right2))
# #logger.info('coord_bl1 = %r' % (coord_bl1,))
# line_coords1 = np.vstack([coord_bl1, coord_bl2])
# line_coords2 = np.vstack([coord_br1, coord_br2])
# logger.info('line_coords1 = %r' % (line_coords1,))
# line1 = mpl.lines.Line2D((line_coords1[0]), (line_coords1[1]), transform=fig.transFigure)
# line2 = mpl.lines.Line2D((line_coords2[0]), (line_coords2[1]), transform=fig.transFigure)
# xs1, ys1 = line_coords1.T
# xs2, ys2 = line_coords2.T
# linekw = dict(transform=fig.transFigure)
# linekw = dict()
# logger.info('xs1 = %r' % (xs1,))
# logger.info('ys1 = %r' % (ys1,))
# line1 = mpl.lines.Line2D(xs1, ys1, **linekw)
# line2 = mpl.lines.Line2D(xs2, ys2, **linekw) # NOQA
# shrinkA=5, shrinkB=5, mutation_scale=20, fc="w")
# ax2.add_artist(con)
# fig.lines.append(line1)
# fig.lines.append(line2)
pass
return fig
# @ut.indent_func
[docs]def show_name(
ibs,
nid,
in_image=True,
fnum=0,
sel_aids=[],
subtitle='',
annote=False,
aid_list=None,
index_list=None,
**kwargs
):
r"""
Args:
ibs (IBEISController): wbia controller object
nid (?):
in_image (bool):
fnum (int): figure number
sel_aids (list):
subtitle (str):
annote (bool):
CommandLine:
python -m wbia.viz.viz_name --test-show_name --dpath ~/latex/crall-candidacy-2015 --save 'figures/{name}.jpg' --no-figtitle --notitle --db NNP_Master3 --figsize=9,4 --clipwhite --dpi=180 --adjust=.05 --index_list=[0,1,2,3] --rc=2,4 --append temp_out_figure.tex --name=IBEIS_PZ_0739 --no-draw_lbls --doboth --no-inimage --diskshow
python -m wbia.viz.viz_name --test-show_name --no-figtitle --notitle --db NNP_Master3 --figsize=9,4 --clipwhite --dpi=180 --adjust=.05 --index_list=[0,1,2,3] --rc=2,4 --append temp_out_figure.tex --name=IBEIS_PZ_0739 --no-draw_lbls --doboth --no-inimage --show
python -m wbia.viz.viz_name --test-show_name --show
Example:
>>> # DISABLE_DOCTEST
>>> from wbia.viz.viz_name import * # NOQA
>>> ibs, nid, in_image, index_list = testdata_showname()
>>> fnum = 0
>>> sel_aids = []
>>> subtitle = ''
>>> annote = False
>>> # execute function
>>> show_name(ibs, nid, in_image, fnum, sel_aids, subtitle, annote, index_list=index_list)
>>> ut.show_if_requested()
"""
logger.info(
'[viz_name] show_name nid=%r, index_list=%r, aid_list=%r'
% (nid, index_list, aid_list)
)
if aid_list is None:
aid_list = ibs.get_name_aids(nid)
else:
assert ut.list_all_eq_to(ibs.get_annot_nids(aid_list), nid)
if index_list is not None:
aid_list = ut.take(aid_list, index_list)
name = ibs.get_name_texts((nid,))
logger.info('[viz_name] * name=%r aid_list=%r' % (name, aid_list))
show_multiple_chips(
ibs,
aid_list,
in_image=in_image,
fnum=fnum,
sel_aids=sel_aids,
annote=annote,
**kwargs
)
if isinstance(nid, np.ndarray):
nid = nid[0]
if isinstance(name, np.ndarray):
name = name[0]
use_figtitle = not ut.get_argflag('--no-figtitle')
if use_figtitle:
figtitle = 'Name View nid=%r name=%r' % (nid, name)
df2.set_figtitle(figtitle)
# if not annote:
# title += ' noannote'
# gs2.tight_layout(fig)
# gs2.update(top=df2.TOP_SUBPLOT_ADJUST)
# df2.set_figtitle(title, subtitle)