Scatter chart
El scatter chart o gráfico de dispersión es una visualización integrada en Power BI. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos:
Drupal\user\Entity\Role::postLoad(Object, Array) (Line: 423)
Drupal\Core\Entity\EntityStorageBase->postLoad(Array) (Line: 353)
Drupal\Core\Entity\EntityStorageBase->loadMultiple(Array) (Line: 16)
Drupal\user\RoleStorage->isPermissionInRoles('access site in maintenance mode', Array) (Line: 112)
Drupal\Core\Session\UserSession->hasPermission('access site in maintenance mode') (Line: 105)
Drupal\Core\Session\AccountProxy->hasPermission('access site in maintenance mode') (Line: 83)
Drupal\redirect\RedirectChecker->canRedirect(Object) (Line: 120)
Drupal\redirect\EventSubscriber\RedirectRequestSubscriber->onKernelRequestCheckRedirect(Object, 'kernel.request', Object)
call_user_func(Array, Object, 'kernel.request', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.request') (Line: 145)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\views\ManyToOneHelper->__construct(Object) (Line: 54)
Drupal\views\Plugin\views\argument\ManyToOne->defineOptions() (Line: 141)
Drupal\views\Plugin\views\PluginBase->init(Object, Object, Array) (Line: 104)
Drupal\views\Plugin\views\HandlerBase->init(Object, Object, Array) (Line: 82)
Drupal\views\Plugin\views\argument\ArgumentPluginBase->init(Object, Object, Array) (Line: 33)
Drupal\views\Plugin\views\argument\ManyToOne->init(Object, Object, Array) (Line: 894)
Drupal\views\Plugin\views\display\DisplayPluginBase->getHandlers('argument') (Line: 1045)
Drupal\views\ViewExecutable->_initHandler('argument', Array) (Line: 903)
Drupal\views\ViewExecutable->initHandlers() (Line: 2318)
Drupal\views\Plugin\views\display\DisplayPluginBase->preExecute() (Line: 1697)
Drupal\views\ViewExecutable->preExecute(Array) (Line: 1632)
Drupal\views\ViewExecutable->executeDisplay('page_1', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\views\ManyToOneHelper->__construct(Object) (Line: 54)
Drupal\views\Plugin\views\argument\ManyToOne->defineOptions() (Line: 228)
Drupal\views\Plugin\views\PluginBase->unpackOptions(Array, Array) (Line: 144)
Drupal\views\Plugin\views\PluginBase->init(Object, Object, Array) (Line: 104)
Drupal\views\Plugin\views\HandlerBase->init(Object, Object, Array) (Line: 82)
Drupal\views\Plugin\views\argument\ArgumentPluginBase->init(Object, Object, Array) (Line: 33)
Drupal\views\Plugin\views\argument\ManyToOne->init(Object, Object, Array) (Line: 894)
Drupal\views\Plugin\views\display\DisplayPluginBase->getHandlers('argument') (Line: 1045)
Drupal\views\ViewExecutable->_initHandler('argument', Array) (Line: 903)
Drupal\views\ViewExecutable->initHandlers() (Line: 2318)
Drupal\views\Plugin\views\display\DisplayPluginBase->preExecute() (Line: 1697)
Drupal\views\ViewExecutable->preExecute(Array) (Line: 1632)
Drupal\views\ViewExecutable->executeDisplay('page_1', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\views\ManyToOneHelper->__construct(Object) (Line: 54)
Drupal\views\Plugin\views\argument\ManyToOne->defineOptions() (Line: 228)
Drupal\views\Plugin\views\PluginBase->unpackOptions(Array, Array) (Line: 110)
Drupal\views\Plugin\views\HandlerBase->init(Object, Object, Array) (Line: 82)
Drupal\views\Plugin\views\argument\ArgumentPluginBase->init(Object, Object, Array) (Line: 33)
Drupal\views\Plugin\views\argument\ManyToOne->init(Object, Object, Array) (Line: 894)
Drupal\views\Plugin\views\display\DisplayPluginBase->getHandlers('argument') (Line: 1045)
Drupal\views\ViewExecutable->_initHandler('argument', Array) (Line: 903)
Drupal\views\ViewExecutable->initHandlers() (Line: 2318)
Drupal\views\Plugin\views\display\DisplayPluginBase->preExecute() (Line: 1697)
Drupal\views\ViewExecutable->preExecute(Array) (Line: 1632)
Drupal\views\ViewExecutable->executeDisplay('page_1', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\views\ManyToOneHelper->__construct(Object) (Line: 35)
Drupal\views\Plugin\views\argument\ManyToOne->init(Object, Object, Array) (Line: 894)
Drupal\views\Plugin\views\display\DisplayPluginBase->getHandlers('argument') (Line: 1045)
Drupal\views\ViewExecutable->_initHandler('argument', Array) (Line: 903)
Drupal\views\ViewExecutable->initHandlers() (Line: 2318)
Drupal\views\Plugin\views\display\DisplayPluginBase->preExecute() (Line: 1697)
Drupal\views\ViewExecutable->preExecute(Array) (Line: 1632)
Drupal\views\ViewExecutable->executeDisplay('page_1', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('views') (Line: 1316)
Drupal\views\Plugin\views\query\Sql->query() (Line: 1454)
Drupal\views\Plugin\views\query\Sql->build(Object) (Line: 1326)
Drupal\views\ViewExecutable->build() (Line: 392)
Drupal\views\Plugin\views\display\PathPluginBase->execute() (Line: 196)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_1', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('views_substitutions', Array) (Line: 1418)
Drupal\views\Plugin\views\query\Sql->query() (Line: 1454)
Drupal\views\Plugin\views\query\Sql->build(Object) (Line: 1326)
Drupal\views\ViewExecutable->build() (Line: 392)
Drupal\views\Plugin\views\display\PathPluginBase->execute() (Line: 196)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_1', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('views') (Line: 1316)
Drupal\views\Plugin\views\query\Sql->query(1) (Line: 1455)
Drupal\views\Plugin\views\query\Sql->build(Object) (Line: 1326)
Drupal\views\ViewExecutable->build() (Line: 392)
Drupal\views\Plugin\views\display\PathPluginBase->execute() (Line: 196)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_1', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('views_substitutions', Array) (Line: 1418)
Drupal\views\Plugin\views\query\Sql->query(1) (Line: 1455)
Drupal\views\Plugin\views\query\Sql->build(Object) (Line: 1326)
Drupal\views\ViewExecutable->build() (Line: 392)
Drupal\views\Plugin\views\display\PathPluginBase->execute() (Line: 196)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_1', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\views\ManyToOneHelper->__construct(Object) (Line: 54)
Drupal\views\Plugin\views\argument\ManyToOne->defineOptions() (Line: 141)
Drupal\views\Plugin\views\PluginBase->init(Object, Object, Array) (Line: 104)
Drupal\views\Plugin\views\HandlerBase->init(Object, Object, Array) (Line: 82)
Drupal\views\Plugin\views\argument\ArgumentPluginBase->init(Object, Object, Array) (Line: 33)
Drupal\views\Plugin\views\argument\ManyToOne->init(Object, Object, Array) (Line: 894)
Drupal\views\Plugin\views\display\DisplayPluginBase->getHandlers('argument') (Line: 1045)
Drupal\views\ViewExecutable->_initHandler('argument', Array) (Line: 903)
Drupal\views\ViewExecutable->initHandlers() (Line: 1876)
Drupal\views\ViewExecutable->buildTitle() (Line: 338)
Drupal\views\Plugin\views\display\Feed->attachTo(Object, 'page_1', Array) (Line: 1733)
Drupal\views\ViewExecutable->attachDisplays() (Line: 1333)
Drupal\views\ViewExecutable->build() (Line: 392)
Drupal\views\Plugin\views\display\PathPluginBase->execute() (Line: 196)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_1', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\views\ManyToOneHelper->__construct(Object) (Line: 54)
Drupal\views\Plugin\views\argument\ManyToOne->defineOptions() (Line: 228)
Drupal\views\Plugin\views\PluginBase->unpackOptions(Array, Array) (Line: 144)
Drupal\views\Plugin\views\PluginBase->init(Object, Object, Array) (Line: 104)
Drupal\views\Plugin\views\HandlerBase->init(Object, Object, Array) (Line: 82)
Drupal\views\Plugin\views\argument\ArgumentPluginBase->init(Object, Object, Array) (Line: 33)
Drupal\views\Plugin\views\argument\ManyToOne->init(Object, Object, Array) (Line: 894)
Drupal\views\Plugin\views\display\DisplayPluginBase->getHandlers('argument') (Line: 1045)
Drupal\views\ViewExecutable->_initHandler('argument', Array) (Line: 903)
Drupal\views\ViewExecutable->initHandlers() (Line: 1876)
Drupal\views\ViewExecutable->buildTitle() (Line: 338)
Drupal\views\Plugin\views\display\Feed->attachTo(Object, 'page_1', Array) (Line: 1733)
Drupal\views\ViewExecutable->attachDisplays() (Line: 1333)
Drupal\views\ViewExecutable->build() (Line: 392)
Drupal\views\Plugin\views\display\PathPluginBase->execute() (Line: 196)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_1', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\views\ManyToOneHelper->__construct(Object) (Line: 54)
Drupal\views\Plugin\views\argument\ManyToOne->defineOptions() (Line: 228)
Drupal\views\Plugin\views\PluginBase->unpackOptions(Array, Array) (Line: 110)
Drupal\views\Plugin\views\HandlerBase->init(Object, Object, Array) (Line: 82)
Drupal\views\Plugin\views\argument\ArgumentPluginBase->init(Object, Object, Array) (Line: 33)
Drupal\views\Plugin\views\argument\ManyToOne->init(Object, Object, Array) (Line: 894)
Drupal\views\Plugin\views\display\DisplayPluginBase->getHandlers('argument') (Line: 1045)
Drupal\views\ViewExecutable->_initHandler('argument', Array) (Line: 903)
Drupal\views\ViewExecutable->initHandlers() (Line: 1876)
Drupal\views\ViewExecutable->buildTitle() (Line: 338)
Drupal\views\Plugin\views\display\Feed->attachTo(Object, 'page_1', Array) (Line: 1733)
Drupal\views\ViewExecutable->attachDisplays() (Line: 1333)
Drupal\views\ViewExecutable->build() (Line: 392)
Drupal\views\Plugin\views\display\PathPluginBase->execute() (Line: 196)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_1', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\views\ManyToOneHelper->__construct(Object) (Line: 35)
Drupal\views\Plugin\views\argument\ManyToOne->init(Object, Object, Array) (Line: 894)
Drupal\views\Plugin\views\display\DisplayPluginBase->getHandlers('argument') (Line: 1045)
Drupal\views\ViewExecutable->_initHandler('argument', Array) (Line: 903)
Drupal\views\ViewExecutable->initHandlers() (Line: 1876)
Drupal\views\ViewExecutable->buildTitle() (Line: 338)
Drupal\views\Plugin\views\display\Feed->attachTo(Object, 'page_1', Array) (Line: 1733)
Drupal\views\ViewExecutable->attachDisplays() (Line: 1333)
Drupal\views\ViewExecutable->build() (Line: 392)
Drupal\views\Plugin\views\display\PathPluginBase->execute() (Line: 196)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1635)
Drupal\views\ViewExecutable->executeDisplay('page_1', Array) (Line: 81)
Drupal\views\Element\View::preRenderViewElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-964da9fe-3a2b-45da-9f3d-03dbe81ba872') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>scatter chart</strong> o <strong>gráfico de dispersión</strong> es una visualización integrada en Power BI. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_01.jpg"></a>
Como vemos en el panel de de configuración, partimos de dos valores base, uno para el eje X y otro para el eje Y (campos <em>Eje X</em> y <em>Eje Y</em> respectivamente), desagregados según un criterio principal (campo <em>Detalles</em>), siendo posible agruparlos según un segundo criterio (campo <em>Leyenda</em>).
Comencemos llevando al campo <em>Eje X</em> una medida con la suma de importes de ventas y al campo <em>Eje Y</em> otra medida con el margen medio de ventas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_02.jpg"></a>
Inicialmente se muestra únicamente el punto del plano de coordenadas determinado por los dos valores en cuestión. Si llevamos una variable categórica al campo <em>Detalles</em>, el punto anterior se va a desagregar según los valores de esta variable. Por ejemplo, llevemos a este campo el campo <em>City</em> que contiene la ciudad en la que se realiza cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_03.jpg"></a>
Ahora, para cada ciudad se muestra los valores de ventas (campo <em>Sales</em>, eje X) y margen medio (campo <em>Average Margin</em>, eje Y).
Si llevamos el campo <em>Country</em> (conteniendo el país al que pertenece cada ciudad) al campo <em>Leyenda</em> de la visualización, las burbujas anteriores toman un color que depende del país al que pertenecen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_04.jpg"></a>
Los colores asignados pueden personalizarse en <em>Formato > Colores de datos</em>.
También podemos añadir una nueva dimensión a la visualización controlando el tamaño de cada uno de las burbujas. Para ello deberemos llevar un campo cuantitativo al campo <em>Tamaño</em> de la visualización. Por ejemplo, si llevamos nuestra medida <em>Units</em> (número de unidades vendidas) a este campo, obtenemos el siguiente resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_05.jpg"></a>
Podemos modificar el tamaño medio de las burbujas en <em>Formato > Formas > Tamaño</em> con el fin de que, por ejemplo, el solape no sea tan grande (véase siguiente imagen).
Por supuesto, al mover el cursor encima de una de las burbujas se muestra una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_06.jpg"></a>
La visualización ofrece un campo adicional, <em>Eje de reproducción</em>, que nos va a permitir mostrar el gráfico de dispersión para cada uno de los valores de la variable categórica que llevemos a este campo (frecuentemente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_07.jpg"></a>
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_08.jpg"></a>
Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_10.jpg"></a>
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
La visualización nos permite configurar los ejes X e Y, modificar la marca a usar para los puntos (círculos, cuadrados, triángulos o rombos), mostrar o no las etiquetas que representan cada punto, etc.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-964da9fe-3a2b-45da-9f3d-03dbe81ba872') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>scatter chart</strong> o <strong>gráfico de dispersión</strong> es una visualización integrada en Power BI. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_01.jpg"></a>
Como vemos en el panel de de configuración, partimos de dos valores base, uno para el eje X y otro para el eje Y (campos <em>Eje X</em> y <em>Eje Y</em> respectivamente), desagregados según un criterio principal (campo <em>Detalles</em>), siendo posible agruparlos según un segundo criterio (campo <em>Leyenda</em>).
Comencemos llevando al campo <em>Eje X</em> una medida con la suma de importes de ventas y al campo <em>Eje Y</em> otra medida con el margen medio de ventas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_02.jpg"></a>
Inicialmente se muestra únicamente el punto del plano de coordenadas determinado por los dos valores en cuestión. Si llevamos una variable categórica al campo <em>Detalles</em>, el punto anterior se va a desagregar según los valores de esta variable. Por ejemplo, llevemos a este campo el campo <em>City</em> que contiene la ciudad en la que se realiza cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_03.jpg"></a>
Ahora, para cada ciudad se muestra los valores de ventas (campo <em>Sales</em>, eje X) y margen medio (campo <em>Average Margin</em>, eje Y).
Si llevamos el campo <em>Country</em> (conteniendo el país al que pertenece cada ciudad) al campo <em>Leyenda</em> de la visualización, las burbujas anteriores toman un color que depende del país al que pertenecen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_04.jpg"></a>
Los colores asignados pueden personalizarse en <em>Formato > Colores de datos</em>.
También podemos añadir una nueva dimensión a la visualización controlando el tamaño de cada uno de las burbujas. Para ello deberemos llevar un campo cuantitativo al campo <em>Tamaño</em> de la visualización. Por ejemplo, si llevamos nuestra medida <em>Units</em> (número de unidades vendidas) a este campo, obtenemos el siguiente resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_05.jpg"></a>
Podemos modificar el tamaño medio de las burbujas en <em>Formato > Formas > Tamaño</em> con el fin de que, por ejemplo, el solape no sea tan grande (véase siguiente imagen).
Por supuesto, al mover el cursor encima de una de las burbujas se muestra una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_06.jpg"></a>
La visualización ofrece un campo adicional, <em>Eje de reproducción</em>, que nos va a permitir mostrar el gráfico de dispersión para cada uno de los valores de la variable categórica que llevemos a este campo (frecuentemente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_07.jpg"></a>
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_08.jpg"></a>
Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_10.jpg"></a>
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
La visualización nos permite configurar los ejes X e Y, modificar la marca a usar para los puntos (círculos, cuadrados, triángulos o rombos), mostrar o no las etiquetas que representan cada punto, etc.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-964da9fe-3a2b-45da-9f3d-03dbe81ba872') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>scatter chart</strong> o <strong>gráfico de dispersión</strong> es una visualización integrada en Power BI. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_01.jpg"></a>
Como vemos en el panel de de configuración, partimos de dos valores base, uno para el eje X y otro para el eje Y (campos <em>Eje X</em> y <em>Eje Y</em> respectivamente), desagregados según un criterio principal (campo <em>Detalles</em>), siendo posible agruparlos según un segundo criterio (campo <em>Leyenda</em>).
Comencemos llevando al campo <em>Eje X</em> una medida con la suma de importes de ventas y al campo <em>Eje Y</em> otra medida con el margen medio de ventas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_02.jpg"></a>
Inicialmente se muestra únicamente el punto del plano de coordenadas determinado por los dos valores en cuestión. Si llevamos una variable categórica al campo <em>Detalles</em>, el punto anterior se va a desagregar según los valores de esta variable. Por ejemplo, llevemos a este campo el campo <em>City</em> que contiene la ciudad en la que se realiza cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_03.jpg"></a>
Ahora, para cada ciudad se muestra los valores de ventas (campo <em>Sales</em>, eje X) y margen medio (campo <em>Average Margin</em>, eje Y).
Si llevamos el campo <em>Country</em> (conteniendo el país al que pertenece cada ciudad) al campo <em>Leyenda</em> de la visualización, las burbujas anteriores toman un color que depende del país al que pertenecen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_04.jpg"></a>
Los colores asignados pueden personalizarse en <em>Formato > Colores de datos</em>.
También podemos añadir una nueva dimensión a la visualización controlando el tamaño de cada uno de las burbujas. Para ello deberemos llevar un campo cuantitativo al campo <em>Tamaño</em> de la visualización. Por ejemplo, si llevamos nuestra medida <em>Units</em> (número de unidades vendidas) a este campo, obtenemos el siguiente resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_05.jpg"></a>
Podemos modificar el tamaño medio de las burbujas en <em>Formato > Formas > Tamaño</em> con el fin de que, por ejemplo, el solape no sea tan grande (véase siguiente imagen).
Por supuesto, al mover el cursor encima de una de las burbujas se muestra una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_06.jpg"></a>
La visualización ofrece un campo adicional, <em>Eje de reproducción</em>, que nos va a permitir mostrar el gráfico de dispersión para cada uno de los valores de la variable categórica que llevemos a este campo (frecuentemente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_07.jpg"></a>
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_08.jpg"></a>
Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_10.jpg"></a>
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
La visualización nos permite configurar los ejes X e Y, modificar la marca a usar para los puntos (círculos, cuadrados, triángulos o rombos), mostrar o no las etiquetas que representan cada punto, etc.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-964da9fe-3a2b-45da-9f3d-03dbe81ba872') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>scatter chart</strong> o <strong>gráfico de dispersión</strong> es una visualización integrada en Power BI. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_01.jpg"></a>
Como vemos en el panel de de configuración, partimos de dos valores base, uno para el eje X y otro para el eje Y (campos <em>Eje X</em> y <em>Eje Y</em> respectivamente), desagregados según un criterio principal (campo <em>Detalles</em>), siendo posible agruparlos según un segundo criterio (campo <em>Leyenda</em>).
Comencemos llevando al campo <em>Eje X</em> una medida con la suma de importes de ventas y al campo <em>Eje Y</em> otra medida con el margen medio de ventas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_02.jpg"></a>
Inicialmente se muestra únicamente el punto del plano de coordenadas determinado por los dos valores en cuestión. Si llevamos una variable categórica al campo <em>Detalles</em>, el punto anterior se va a desagregar según los valores de esta variable. Por ejemplo, llevemos a este campo el campo <em>City</em> que contiene la ciudad en la que se realiza cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_03.jpg"></a>
Ahora, para cada ciudad se muestra los valores de ventas (campo <em>Sales</em>, eje X) y margen medio (campo <em>Average Margin</em>, eje Y).
Si llevamos el campo <em>Country</em> (conteniendo el país al que pertenece cada ciudad) al campo <em>Leyenda</em> de la visualización, las burbujas anteriores toman un color que depende del país al que pertenecen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_04.jpg"></a>
Los colores asignados pueden personalizarse en <em>Formato > Colores de datos</em>.
También podemos añadir una nueva dimensión a la visualización controlando el tamaño de cada uno de las burbujas. Para ello deberemos llevar un campo cuantitativo al campo <em>Tamaño</em> de la visualización. Por ejemplo, si llevamos nuestra medida <em>Units</em> (número de unidades vendidas) a este campo, obtenemos el siguiente resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_05.jpg"></a>
Podemos modificar el tamaño medio de las burbujas en <em>Formato > Formas > Tamaño</em> con el fin de que, por ejemplo, el solape no sea tan grande (véase siguiente imagen).
Por supuesto, al mover el cursor encima de una de las burbujas se muestra una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_06.jpg"></a>
La visualización ofrece un campo adicional, <em>Eje de reproducción</em>, que nos va a permitir mostrar el gráfico de dispersión para cada uno de los valores de la variable categórica que llevemos a este campo (frecuentemente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_07.jpg"></a>
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_08.jpg"></a>
Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_10.jpg"></a>
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
La visualización nos permite configurar los ejes X e Y, modificar la marca a usar para los puntos (círculos, cuadrados, triángulos o rombos), mostrar o no las etiquetas que representan cada punto, etc.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-cb965031-62c0-4bde-8bf1-d3e7621eff87') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>scatter chart</strong> o <strong>gráfico de dispersión</strong> es una visualización integrada en Power BI. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_01.jpg"></a>
Como vemos en el panel de de configuración, partimos de dos valores base, uno para el eje X y otro para el eje Y (campos <em>Eje X</em> y <em>Eje Y</em> respectivamente), desagregados según un criterio principal (campo <em>Detalles</em>), siendo posible agruparlos según un segundo criterio (campo <em>Leyenda</em>).
Comencemos llevando al campo <em>Eje X</em> una medida con la suma de importes de ventas y al campo <em>Eje Y</em> otra medida con el margen medio de ventas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_02.jpg"></a>
Inicialmente se muestra únicamente el punto del plano de coordenadas determinado por los dos valores en cuestión. Si llevamos una variable categórica al campo <em>Detalles</em>, el punto anterior se va a desagregar según los valores de esta variable. Por ejemplo, llevemos a este campo el campo <em>City</em> que contiene la ciudad en la que se realiza cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_03.jpg"></a>
Ahora, para cada ciudad se muestra los valores de ventas (campo <em>Sales</em>, eje X) y margen medio (campo <em>Average Margin</em>, eje Y).
Si llevamos el campo <em>Country</em> (conteniendo el país al que pertenece cada ciudad) al campo <em>Leyenda</em> de la visualización, las burbujas anteriores toman un color que depende del país al que pertenecen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_04.jpg"></a>
Los colores asignados pueden personalizarse en <em>Formato > Colores de datos</em>.
También podemos añadir una nueva dimensión a la visualización controlando el tamaño de cada uno de las burbujas. Para ello deberemos llevar un campo cuantitativo al campo <em>Tamaño</em> de la visualización. Por ejemplo, si llevamos nuestra medida <em>Units</em> (número de unidades vendidas) a este campo, obtenemos el siguiente resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_05.jpg"></a>
Podemos modificar el tamaño medio de las burbujas en <em>Formato > Formas > Tamaño</em> con el fin de que, por ejemplo, el solape no sea tan grande (véase siguiente imagen).
Por supuesto, al mover el cursor encima de una de las burbujas se muestra una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_06.jpg"></a>
La visualización ofrece un campo adicional, <em>Eje de reproducción</em>, que nos va a permitir mostrar el gráfico de dispersión para cada uno de los valores de la variable categórica que llevemos a este campo (frecuentemente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_07.jpg"></a>
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_08.jpg"></a>
Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_10.jpg"></a>
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
La visualización nos permite configurar los ejes X e Y, modificar la marca a usar para los puntos (círculos, cuadrados, triángulos o rombos), mostrar o no las etiquetas que representan cada punto, etc.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-cb965031-62c0-4bde-8bf1-d3e7621eff87') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>scatter chart</strong> o <strong>gráfico de dispersión</strong> es una visualización integrada en Power BI. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_01.jpg"></a>
Como vemos en el panel de de configuración, partimos de dos valores base, uno para el eje X y otro para el eje Y (campos <em>Eje X</em> y <em>Eje Y</em> respectivamente), desagregados según un criterio principal (campo <em>Detalles</em>), siendo posible agruparlos según un segundo criterio (campo <em>Leyenda</em>).
Comencemos llevando al campo <em>Eje X</em> una medida con la suma de importes de ventas y al campo <em>Eje Y</em> otra medida con el margen medio de ventas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_02.jpg"></a>
Inicialmente se muestra únicamente el punto del plano de coordenadas determinado por los dos valores en cuestión. Si llevamos una variable categórica al campo <em>Detalles</em>, el punto anterior se va a desagregar según los valores de esta variable. Por ejemplo, llevemos a este campo el campo <em>City</em> que contiene la ciudad en la que se realiza cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_03.jpg"></a>
Ahora, para cada ciudad se muestra los valores de ventas (campo <em>Sales</em>, eje X) y margen medio (campo <em>Average Margin</em>, eje Y).
Si llevamos el campo <em>Country</em> (conteniendo el país al que pertenece cada ciudad) al campo <em>Leyenda</em> de la visualización, las burbujas anteriores toman un color que depende del país al que pertenecen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_04.jpg"></a>
Los colores asignados pueden personalizarse en <em>Formato > Colores de datos</em>.
También podemos añadir una nueva dimensión a la visualización controlando el tamaño de cada uno de las burbujas. Para ello deberemos llevar un campo cuantitativo al campo <em>Tamaño</em> de la visualización. Por ejemplo, si llevamos nuestra medida <em>Units</em> (número de unidades vendidas) a este campo, obtenemos el siguiente resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_05.jpg"></a>
Podemos modificar el tamaño medio de las burbujas en <em>Formato > Formas > Tamaño</em> con el fin de que, por ejemplo, el solape no sea tan grande (véase siguiente imagen).
Por supuesto, al mover el cursor encima de una de las burbujas se muestra una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_06.jpg"></a>
La visualización ofrece un campo adicional, <em>Eje de reproducción</em>, que nos va a permitir mostrar el gráfico de dispersión para cada uno de los valores de la variable categórica que llevemos a este campo (frecuentemente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_07.jpg"></a>
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_08.jpg"></a>
Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_10.jpg"></a>
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
La visualización nos permite configurar los ejes X e Y, modificar la marca a usar para los puntos (círculos, cuadrados, triángulos o rombos), mostrar o no las etiquetas que representan cada punto, etc.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-cb965031-62c0-4bde-8bf1-d3e7621eff87') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>scatter chart</strong> o <strong>gráfico de dispersión</strong> es una visualización integrada en Power BI. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_01.jpg"></a>
Como vemos en el panel de de configuración, partimos de dos valores base, uno para el eje X y otro para el eje Y (campos <em>Eje X</em> y <em>Eje Y</em> respectivamente), desagregados según un criterio principal (campo <em>Detalles</em>), siendo posible agruparlos según un segundo criterio (campo <em>Leyenda</em>).
Comencemos llevando al campo <em>Eje X</em> una medida con la suma de importes de ventas y al campo <em>Eje Y</em> otra medida con el margen medio de ventas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_02.jpg"></a>
Inicialmente se muestra únicamente el punto del plano de coordenadas determinado por los dos valores en cuestión. Si llevamos una variable categórica al campo <em>Detalles</em>, el punto anterior se va a desagregar según los valores de esta variable. Por ejemplo, llevemos a este campo el campo <em>City</em> que contiene la ciudad en la que se realiza cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_03.jpg"></a>
Ahora, para cada ciudad se muestra los valores de ventas (campo <em>Sales</em>, eje X) y margen medio (campo <em>Average Margin</em>, eje Y).
Si llevamos el campo <em>Country</em> (conteniendo el país al que pertenece cada ciudad) al campo <em>Leyenda</em> de la visualización, las burbujas anteriores toman un color que depende del país al que pertenecen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_04.jpg"></a>
Los colores asignados pueden personalizarse en <em>Formato > Colores de datos</em>.
También podemos añadir una nueva dimensión a la visualización controlando el tamaño de cada uno de las burbujas. Para ello deberemos llevar un campo cuantitativo al campo <em>Tamaño</em> de la visualización. Por ejemplo, si llevamos nuestra medida <em>Units</em> (número de unidades vendidas) a este campo, obtenemos el siguiente resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_05.jpg"></a>
Podemos modificar el tamaño medio de las burbujas en <em>Formato > Formas > Tamaño</em> con el fin de que, por ejemplo, el solape no sea tan grande (véase siguiente imagen).
Por supuesto, al mover el cursor encima de una de las burbujas se muestra una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_06.jpg"></a>
La visualización ofrece un campo adicional, <em>Eje de reproducción</em>, que nos va a permitir mostrar el gráfico de dispersión para cada uno de los valores de la variable categórica que llevemos a este campo (frecuentemente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_07.jpg"></a>
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_08.jpg"></a>
Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_10.jpg"></a>
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
La visualización nos permite configurar los ejes X e Y, modificar la marca a usar para los puntos (círculos, cuadrados, triángulos o rombos), mostrar o no las etiquetas que representan cada punto, etc.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-cb965031-62c0-4bde-8bf1-d3e7621eff87') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>scatter chart</strong> o <strong>gráfico de dispersión</strong> es una visualización integrada en Power BI. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_01.jpg"></a>
Como vemos en el panel de de configuración, partimos de dos valores base, uno para el eje X y otro para el eje Y (campos <em>Eje X</em> y <em>Eje Y</em> respectivamente), desagregados según un criterio principal (campo <em>Detalles</em>), siendo posible agruparlos según un segundo criterio (campo <em>Leyenda</em>).
Comencemos llevando al campo <em>Eje X</em> una medida con la suma de importes de ventas y al campo <em>Eje Y</em> otra medida con el margen medio de ventas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_02.jpg"></a>
Inicialmente se muestra únicamente el punto del plano de coordenadas determinado por los dos valores en cuestión. Si llevamos una variable categórica al campo <em>Detalles</em>, el punto anterior se va a desagregar según los valores de esta variable. Por ejemplo, llevemos a este campo el campo <em>City</em> que contiene la ciudad en la que se realiza cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_03.jpg"></a>
Ahora, para cada ciudad se muestra los valores de ventas (campo <em>Sales</em>, eje X) y margen medio (campo <em>Average Margin</em>, eje Y).
Si llevamos el campo <em>Country</em> (conteniendo el país al que pertenece cada ciudad) al campo <em>Leyenda</em> de la visualización, las burbujas anteriores toman un color que depende del país al que pertenecen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_04.jpg"></a>
Los colores asignados pueden personalizarse en <em>Formato > Colores de datos</em>.
También podemos añadir una nueva dimensión a la visualización controlando el tamaño de cada uno de las burbujas. Para ello deberemos llevar un campo cuantitativo al campo <em>Tamaño</em> de la visualización. Por ejemplo, si llevamos nuestra medida <em>Units</em> (número de unidades vendidas) a este campo, obtenemos el siguiente resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_05.jpg"></a>
Podemos modificar el tamaño medio de las burbujas en <em>Formato > Formas > Tamaño</em> con el fin de que, por ejemplo, el solape no sea tan grande (véase siguiente imagen).
Por supuesto, al mover el cursor encima de una de las burbujas se muestra una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_06.jpg"></a>
La visualización ofrece un campo adicional, <em>Eje de reproducción</em>, que nos va a permitir mostrar el gráfico de dispersión para cada uno de los valores de la variable categórica que llevemos a este campo (frecuentemente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_07.jpg"></a>
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_08.jpg"></a>
Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_10.jpg"></a>
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
La visualización nos permite configurar los ejes X e Y, modificar la marca a usar para los puntos (círculos, cuadrados, triángulos o rombos), mostrar o no las etiquetas que representan cada punto, etc.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-4e68a093-2576-45d9-9d1a-c34a55c5754c') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>scatter chart</strong> o <strong>gráfico de dispersión</strong> es una visualización integrada en Power BI. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_01.jpg"></a>
Como vemos en el panel de de configuración, partimos de dos valores base, uno para el eje X y otro para el eje Y (campos <em>Eje X</em> y <em>Eje Y</em> respectivamente), desagregados según un criterio principal (campo <em>Detalles</em>), siendo posible agruparlos según un segundo criterio (campo <em>Leyenda</em>).
Comencemos llevando al campo <em>Eje X</em> una medida con la suma de importes de ventas y al campo <em>Eje Y</em> otra medida con el margen medio de ventas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_02.jpg"></a>
Inicialmente se muestra únicamente el punto del plano de coordenadas determinado por los dos valores en cuestión. Si llevamos una variable categórica al campo <em>Detalles</em>, el punto anterior se va a desagregar según los valores de esta variable. Por ejemplo, llevemos a este campo el campo <em>City</em> que contiene la ciudad en la que se realiza cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_03.jpg"></a>
Ahora, para cada ciudad se muestra los valores de ventas (campo <em>Sales</em>, eje X) y margen medio (campo <em>Average Margin</em>, eje Y).
Si llevamos el campo <em>Country</em> (conteniendo el país al que pertenece cada ciudad) al campo <em>Leyenda</em> de la visualización, las burbujas anteriores toman un color que depende del país al que pertenecen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_04.jpg"></a>
Los colores asignados pueden personalizarse en <em>Formato > Colores de datos</em>.
También podemos añadir una nueva dimensión a la visualización controlando el tamaño de cada uno de las burbujas. Para ello deberemos llevar un campo cuantitativo al campo <em>Tamaño</em> de la visualización. Por ejemplo, si llevamos nuestra medida <em>Units</em> (número de unidades vendidas) a este campo, obtenemos el siguiente resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_05.jpg"></a>
Podemos modificar el tamaño medio de las burbujas en <em>Formato > Formas > Tamaño</em> con el fin de que, por ejemplo, el solape no sea tan grande (véase siguiente imagen).
Por supuesto, al mover el cursor encima de una de las burbujas se muestra una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_06.jpg"></a>
La visualización ofrece un campo adicional, <em>Eje de reproducción</em>, que nos va a permitir mostrar el gráfico de dispersión para cada uno de los valores de la variable categórica que llevemos a este campo (frecuentemente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_07.jpg"></a>
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_08.jpg"></a>
Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_10.jpg"></a>
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
La visualización nos permite configurar los ejes X e Y, modificar la marca a usar para los puntos (círculos, cuadrados, triángulos o rombos), mostrar o no las etiquetas que representan cada punto, etc.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-4e68a093-2576-45d9-9d1a-c34a55c5754c') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>scatter chart</strong> o <strong>gráfico de dispersión</strong> es una visualización integrada en Power BI. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_01.jpg"></a>
Como vemos en el panel de de configuración, partimos de dos valores base, uno para el eje X y otro para el eje Y (campos <em>Eje X</em> y <em>Eje Y</em> respectivamente), desagregados según un criterio principal (campo <em>Detalles</em>), siendo posible agruparlos según un segundo criterio (campo <em>Leyenda</em>).
Comencemos llevando al campo <em>Eje X</em> una medida con la suma de importes de ventas y al campo <em>Eje Y</em> otra medida con el margen medio de ventas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_02.jpg"></a>
Inicialmente se muestra únicamente el punto del plano de coordenadas determinado por los dos valores en cuestión. Si llevamos una variable categórica al campo <em>Detalles</em>, el punto anterior se va a desagregar según los valores de esta variable. Por ejemplo, llevemos a este campo el campo <em>City</em> que contiene la ciudad en la que se realiza cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_03.jpg"></a>
Ahora, para cada ciudad se muestra los valores de ventas (campo <em>Sales</em>, eje X) y margen medio (campo <em>Average Margin</em>, eje Y).
Si llevamos el campo <em>Country</em> (conteniendo el país al que pertenece cada ciudad) al campo <em>Leyenda</em> de la visualización, las burbujas anteriores toman un color que depende del país al que pertenecen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_04.jpg"></a>
Los colores asignados pueden personalizarse en <em>Formato > Colores de datos</em>.
También podemos añadir una nueva dimensión a la visualización controlando el tamaño de cada uno de las burbujas. Para ello deberemos llevar un campo cuantitativo al campo <em>Tamaño</em> de la visualización. Por ejemplo, si llevamos nuestra medida <em>Units</em> (número de unidades vendidas) a este campo, obtenemos el siguiente resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_05.jpg"></a>
Podemos modificar el tamaño medio de las burbujas en <em>Formato > Formas > Tamaño</em> con el fin de que, por ejemplo, el solape no sea tan grande (véase siguiente imagen).
Por supuesto, al mover el cursor encima de una de las burbujas se muestra una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_06.jpg"></a>
La visualización ofrece un campo adicional, <em>Eje de reproducción</em>, que nos va a permitir mostrar el gráfico de dispersión para cada uno de los valores de la variable categórica que llevemos a este campo (frecuentemente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_07.jpg"></a>
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_08.jpg"></a>
Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_10.jpg"></a>
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
La visualización nos permite configurar los ejes X e Y, modificar la marca a usar para los puntos (círculos, cuadrados, triángulos o rombos), mostrar o no las etiquetas que representan cada punto, etc.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-4e68a093-2576-45d9-9d1a-c34a55c5754c') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>scatter chart</strong> o <strong>gráfico de dispersión</strong> es una visualización integrada en Power BI. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_01.jpg"></a>
Como vemos en el panel de de configuración, partimos de dos valores base, uno para el eje X y otro para el eje Y (campos <em>Eje X</em> y <em>Eje Y</em> respectivamente), desagregados según un criterio principal (campo <em>Detalles</em>), siendo posible agruparlos según un segundo criterio (campo <em>Leyenda</em>).
Comencemos llevando al campo <em>Eje X</em> una medida con la suma de importes de ventas y al campo <em>Eje Y</em> otra medida con el margen medio de ventas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_02.jpg"></a>
Inicialmente se muestra únicamente el punto del plano de coordenadas determinado por los dos valores en cuestión. Si llevamos una variable categórica al campo <em>Detalles</em>, el punto anterior se va a desagregar según los valores de esta variable. Por ejemplo, llevemos a este campo el campo <em>City</em> que contiene la ciudad en la que se realiza cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_03.jpg"></a>
Ahora, para cada ciudad se muestra los valores de ventas (campo <em>Sales</em>, eje X) y margen medio (campo <em>Average Margin</em>, eje Y).
Si llevamos el campo <em>Country</em> (conteniendo el país al que pertenece cada ciudad) al campo <em>Leyenda</em> de la visualización, las burbujas anteriores toman un color que depende del país al que pertenecen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_04.jpg"></a>
Los colores asignados pueden personalizarse en <em>Formato > Colores de datos</em>.
También podemos añadir una nueva dimensión a la visualización controlando el tamaño de cada uno de las burbujas. Para ello deberemos llevar un campo cuantitativo al campo <em>Tamaño</em> de la visualización. Por ejemplo, si llevamos nuestra medida <em>Units</em> (número de unidades vendidas) a este campo, obtenemos el siguiente resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_05.jpg"></a>
Podemos modificar el tamaño medio de las burbujas en <em>Formato > Formas > Tamaño</em> con el fin de que, por ejemplo, el solape no sea tan grande (véase siguiente imagen).
Por supuesto, al mover el cursor encima de una de las burbujas se muestra una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_06.jpg"></a>
La visualización ofrece un campo adicional, <em>Eje de reproducción</em>, que nos va a permitir mostrar el gráfico de dispersión para cada uno de los valores de la variable categórica que llevemos a este campo (frecuentemente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_07.jpg"></a>
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_08.jpg"></a>
Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_10.jpg"></a>
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
La visualización nos permite configurar los ejes X e Y, modificar la marca a usar para los puntos (círculos, cuadrados, triángulos o rombos), mostrar o no las etiquetas que representan cada punto, etc.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-4e68a093-2576-45d9-9d1a-c34a55c5754c') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>scatter chart</strong> o <strong>gráfico de dispersión</strong> es una visualización integrada en Power BI. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_01.jpg"></a>
Como vemos en el panel de de configuración, partimos de dos valores base, uno para el eje X y otro para el eje Y (campos <em>Eje X</em> y <em>Eje Y</em> respectivamente), desagregados según un criterio principal (campo <em>Detalles</em>), siendo posible agruparlos según un segundo criterio (campo <em>Leyenda</em>).
Comencemos llevando al campo <em>Eje X</em> una medida con la suma de importes de ventas y al campo <em>Eje Y</em> otra medida con el margen medio de ventas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_02.jpg"></a>
Inicialmente se muestra únicamente el punto del plano de coordenadas determinado por los dos valores en cuestión. Si llevamos una variable categórica al campo <em>Detalles</em>, el punto anterior se va a desagregar según los valores de esta variable. Por ejemplo, llevemos a este campo el campo <em>City</em> que contiene la ciudad en la que se realiza cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_03.jpg"></a>
Ahora, para cada ciudad se muestra los valores de ventas (campo <em>Sales</em>, eje X) y margen medio (campo <em>Average Margin</em>, eje Y).
Si llevamos el campo <em>Country</em> (conteniendo el país al que pertenece cada ciudad) al campo <em>Leyenda</em> de la visualización, las burbujas anteriores toman un color que depende del país al que pertenecen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_04.jpg"></a>
Los colores asignados pueden personalizarse en <em>Formato > Colores de datos</em>.
También podemos añadir una nueva dimensión a la visualización controlando el tamaño de cada uno de las burbujas. Para ello deberemos llevar un campo cuantitativo al campo <em>Tamaño</em> de la visualización. Por ejemplo, si llevamos nuestra medida <em>Units</em> (número de unidades vendidas) a este campo, obtenemos el siguiente resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_05.jpg"></a>
Podemos modificar el tamaño medio de las burbujas en <em>Formato > Formas > Tamaño</em> con el fin de que, por ejemplo, el solape no sea tan grande (véase siguiente imagen).
Por supuesto, al mover el cursor encima de una de las burbujas se muestra una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_06.jpg"></a>
La visualización ofrece un campo adicional, <em>Eje de reproducción</em>, que nos va a permitir mostrar el gráfico de dispersión para cada uno de los valores de la variable categórica que llevemos a este campo (frecuentemente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_07.jpg"></a>
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_08.jpg"></a>
Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_10.jpg"></a>
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
La visualización nos permite configurar los ejes X e Y, modificar la marca a usar para los puntos (círculos, cuadrados, triángulos o rombos), mostrar o no las etiquetas que representan cada punto, etc.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-52b99690-a05c-40d5-97eb-5745510481de') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>scatter chart</strong> o <strong>gráfico de dispersión</strong> es una visualización integrada en Power BI. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_01.jpg"></a>
Como vemos en el panel de de configuración, partimos de dos valores base, uno para el eje X y otro para el eje Y (campos <em>Eje X</em> y <em>Eje Y</em> respectivamente), desagregados según un criterio principal (campo <em>Detalles</em>), siendo posible agruparlos según un segundo criterio (campo <em>Leyenda</em>).
Comencemos llevando al campo <em>Eje X</em> una medida con la suma de importes de ventas y al campo <em>Eje Y</em> otra medida con el margen medio de ventas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_02.jpg"></a>
Inicialmente se muestra únicamente el punto del plano de coordenadas determinado por los dos valores en cuestión. Si llevamos una variable categórica al campo <em>Detalles</em>, el punto anterior se va a desagregar según los valores de esta variable. Por ejemplo, llevemos a este campo el campo <em>City</em> que contiene la ciudad en la que se realiza cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_03.jpg"></a>
Ahora, para cada ciudad se muestra los valores de ventas (campo <em>Sales</em>, eje X) y margen medio (campo <em>Average Margin</em>, eje Y).
Si llevamos el campo <em>Country</em> (conteniendo el país al que pertenece cada ciudad) al campo <em>Leyenda</em> de la visualización, las burbujas anteriores toman un color que depende del país al que pertenecen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_04.jpg"></a>
Los colores asignados pueden personalizarse en <em>Formato > Colores de datos</em>.
También podemos añadir una nueva dimensión a la visualización controlando el tamaño de cada uno de las burbujas. Para ello deberemos llevar un campo cuantitativo al campo <em>Tamaño</em> de la visualización. Por ejemplo, si llevamos nuestra medida <em>Units</em> (número de unidades vendidas) a este campo, obtenemos el siguiente resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_05.jpg"></a>
Podemos modificar el tamaño medio de las burbujas en <em>Formato > Formas > Tamaño</em> con el fin de que, por ejemplo, el solape no sea tan grande (véase siguiente imagen).
Por supuesto, al mover el cursor encima de una de las burbujas se muestra una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_06.jpg"></a>
La visualización ofrece un campo adicional, <em>Eje de reproducción</em>, que nos va a permitir mostrar el gráfico de dispersión para cada uno de los valores de la variable categórica que llevemos a este campo (frecuentemente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_07.jpg"></a>
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_08.jpg"></a>
Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_10.jpg"></a>
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
La visualización nos permite configurar los ejes X e Y, modificar la marca a usar para los puntos (círculos, cuadrados, triángulos o rombos), mostrar o no las etiquetas que representan cada punto, etc.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-52b99690-a05c-40d5-97eb-5745510481de') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>scatter chart</strong> o <strong>gráfico de dispersión</strong> es una visualización integrada en Power BI. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_01.jpg"></a>
Como vemos en el panel de de configuración, partimos de dos valores base, uno para el eje X y otro para el eje Y (campos <em>Eje X</em> y <em>Eje Y</em> respectivamente), desagregados según un criterio principal (campo <em>Detalles</em>), siendo posible agruparlos según un segundo criterio (campo <em>Leyenda</em>).
Comencemos llevando al campo <em>Eje X</em> una medida con la suma de importes de ventas y al campo <em>Eje Y</em> otra medida con el margen medio de ventas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_02.jpg"></a>
Inicialmente se muestra únicamente el punto del plano de coordenadas determinado por los dos valores en cuestión. Si llevamos una variable categórica al campo <em>Detalles</em>, el punto anterior se va a desagregar según los valores de esta variable. Por ejemplo, llevemos a este campo el campo <em>City</em> que contiene la ciudad en la que se realiza cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_03.jpg"></a>
Ahora, para cada ciudad se muestra los valores de ventas (campo <em>Sales</em>, eje X) y margen medio (campo <em>Average Margin</em>, eje Y).
Si llevamos el campo <em>Country</em> (conteniendo el país al que pertenece cada ciudad) al campo <em>Leyenda</em> de la visualización, las burbujas anteriores toman un color que depende del país al que pertenecen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_04.jpg"></a>
Los colores asignados pueden personalizarse en <em>Formato > Colores de datos</em>.
También podemos añadir una nueva dimensión a la visualización controlando el tamaño de cada uno de las burbujas. Para ello deberemos llevar un campo cuantitativo al campo <em>Tamaño</em> de la visualización. Por ejemplo, si llevamos nuestra medida <em>Units</em> (número de unidades vendidas) a este campo, obtenemos el siguiente resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_05.jpg"></a>
Podemos modificar el tamaño medio de las burbujas en <em>Formato > Formas > Tamaño</em> con el fin de que, por ejemplo, el solape no sea tan grande (véase siguiente imagen).
Por supuesto, al mover el cursor encima de una de las burbujas se muestra una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_06.jpg"></a>
La visualización ofrece un campo adicional, <em>Eje de reproducción</em>, que nos va a permitir mostrar el gráfico de dispersión para cada uno de los valores de la variable categórica que llevemos a este campo (frecuentemente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_07.jpg"></a>
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_08.jpg"></a>
Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_10.jpg"></a>
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
La visualización nos permite configurar los ejes X e Y, modificar la marca a usar para los puntos (círculos, cuadrados, triángulos o rombos), mostrar o no las etiquetas que representan cada punto, etc.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-52b99690-a05c-40d5-97eb-5745510481de') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>scatter chart</strong> o <strong>gráfico de dispersión</strong> es una visualización integrada en Power BI. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_01.jpg"></a>
Como vemos en el panel de de configuración, partimos de dos valores base, uno para el eje X y otro para el eje Y (campos <em>Eje X</em> y <em>Eje Y</em> respectivamente), desagregados según un criterio principal (campo <em>Detalles</em>), siendo posible agruparlos según un segundo criterio (campo <em>Leyenda</em>).
Comencemos llevando al campo <em>Eje X</em> una medida con la suma de importes de ventas y al campo <em>Eje Y</em> otra medida con el margen medio de ventas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_02.jpg"></a>
Inicialmente se muestra únicamente el punto del plano de coordenadas determinado por los dos valores en cuestión. Si llevamos una variable categórica al campo <em>Detalles</em>, el punto anterior se va a desagregar según los valores de esta variable. Por ejemplo, llevemos a este campo el campo <em>City</em> que contiene la ciudad en la que se realiza cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_03.jpg"></a>
Ahora, para cada ciudad se muestra los valores de ventas (campo <em>Sales</em>, eje X) y margen medio (campo <em>Average Margin</em>, eje Y).
Si llevamos el campo <em>Country</em> (conteniendo el país al que pertenece cada ciudad) al campo <em>Leyenda</em> de la visualización, las burbujas anteriores toman un color que depende del país al que pertenecen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_04.jpg"></a>
Los colores asignados pueden personalizarse en <em>Formato > Colores de datos</em>.
También podemos añadir una nueva dimensión a la visualización controlando el tamaño de cada uno de las burbujas. Para ello deberemos llevar un campo cuantitativo al campo <em>Tamaño</em> de la visualización. Por ejemplo, si llevamos nuestra medida <em>Units</em> (número de unidades vendidas) a este campo, obtenemos el siguiente resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_05.jpg"></a>
Podemos modificar el tamaño medio de las burbujas en <em>Formato > Formas > Tamaño</em> con el fin de que, por ejemplo, el solape no sea tan grande (véase siguiente imagen).
Por supuesto, al mover el cursor encima de una de las burbujas se muestra una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_06.jpg"></a>
La visualización ofrece un campo adicional, <em>Eje de reproducción</em>, que nos va a permitir mostrar el gráfico de dispersión para cada uno de los valores de la variable categórica que llevemos a este campo (frecuentemente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_07.jpg"></a>
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_08.jpg"></a>
Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_10.jpg"></a>
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
La visualización nos permite configurar los ejes X e Y, modificar la marca a usar para los puntos (círculos, cuadrados, triángulos o rombos), mostrar o no las etiquetas que representan cada punto, etc.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-52b99690-a05c-40d5-97eb-5745510481de') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>scatter chart</strong> o <strong>gráfico de dispersión</strong> es una visualización integrada en Power BI. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_01.jpg"></a>
Como vemos en el panel de de configuración, partimos de dos valores base, uno para el eje X y otro para el eje Y (campos <em>Eje X</em> y <em>Eje Y</em> respectivamente), desagregados según un criterio principal (campo <em>Detalles</em>), siendo posible agruparlos según un segundo criterio (campo <em>Leyenda</em>).
Comencemos llevando al campo <em>Eje X</em> una medida con la suma de importes de ventas y al campo <em>Eje Y</em> otra medida con el margen medio de ventas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_02.jpg"></a>
Inicialmente se muestra únicamente el punto del plano de coordenadas determinado por los dos valores en cuestión. Si llevamos una variable categórica al campo <em>Detalles</em>, el punto anterior se va a desagregar según los valores de esta variable. Por ejemplo, llevemos a este campo el campo <em>City</em> que contiene la ciudad en la que se realiza cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_03.jpg"></a>
Ahora, para cada ciudad se muestra los valores de ventas (campo <em>Sales</em>, eje X) y margen medio (campo <em>Average Margin</em>, eje Y).
Si llevamos el campo <em>Country</em> (conteniendo el país al que pertenece cada ciudad) al campo <em>Leyenda</em> de la visualización, las burbujas anteriores toman un color que depende del país al que pertenecen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_04.jpg"></a>
Los colores asignados pueden personalizarse en <em>Formato > Colores de datos</em>.
También podemos añadir una nueva dimensión a la visualización controlando el tamaño de cada uno de las burbujas. Para ello deberemos llevar un campo cuantitativo al campo <em>Tamaño</em> de la visualización. Por ejemplo, si llevamos nuestra medida <em>Units</em> (número de unidades vendidas) a este campo, obtenemos el siguiente resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_05.jpg"></a>
Podemos modificar el tamaño medio de las burbujas en <em>Formato > Formas > Tamaño</em> con el fin de que, por ejemplo, el solape no sea tan grande (véase siguiente imagen).
Por supuesto, al mover el cursor encima de una de las burbujas se muestra una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_06.jpg"></a>
La visualización ofrece un campo adicional, <em>Eje de reproducción</em>, que nos va a permitir mostrar el gráfico de dispersión para cada uno de los valores de la variable categórica que llevemos a este campo (frecuentemente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_07.jpg"></a>
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_08.jpg"></a>
Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_10.jpg"></a>
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
La visualización nos permite configurar los ejes X e Y, modificar la marca a usar para los puntos (círculos, cuadrados, triángulos o rombos), mostrar o no las etiquetas que representan cada punto, etc.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-deb07197-ef41-4b66-b876-66716a57594a') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>scatter chart</strong> o <strong>gráfico de dispersión</strong> es una visualización integrada en Power BI. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_01.jpg"></a>
Como vemos en el panel de de configuración, partimos de dos valores base, uno para el eje X y otro para el eje Y (campos <em>Eje X</em> y <em>Eje Y</em> respectivamente), desagregados según un criterio principal (campo <em>Detalles</em>), siendo posible agruparlos según un segundo criterio (campo <em>Leyenda</em>).
Comencemos llevando al campo <em>Eje X</em> una medida con la suma de importes de ventas y al campo <em>Eje Y</em> otra medida con el margen medio de ventas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_02.jpg"></a>
Inicialmente se muestra únicamente el punto del plano de coordenadas determinado por los dos valores en cuestión. Si llevamos una variable categórica al campo <em>Detalles</em>, el punto anterior se va a desagregar según los valores de esta variable. Por ejemplo, llevemos a este campo el campo <em>City</em> que contiene la ciudad en la que se realiza cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_03.jpg"></a>
Ahora, para cada ciudad se muestra los valores de ventas (campo <em>Sales</em>, eje X) y margen medio (campo <em>Average Margin</em>, eje Y).
Si llevamos el campo <em>Country</em> (conteniendo el país al que pertenece cada ciudad) al campo <em>Leyenda</em> de la visualización, las burbujas anteriores toman un color que depende del país al que pertenecen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_04.jpg"></a>
Los colores asignados pueden personalizarse en <em>Formato > Colores de datos</em>.
También podemos añadir una nueva dimensión a la visualización controlando el tamaño de cada uno de las burbujas. Para ello deberemos llevar un campo cuantitativo al campo <em>Tamaño</em> de la visualización. Por ejemplo, si llevamos nuestra medida <em>Units</em> (número de unidades vendidas) a este campo, obtenemos el siguiente resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_05.jpg"></a>
Podemos modificar el tamaño medio de las burbujas en <em>Formato > Formas > Tamaño</em> con el fin de que, por ejemplo, el solape no sea tan grande (véase siguiente imagen).
Por supuesto, al mover el cursor encima de una de las burbujas se muestra una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_06.jpg"></a>
La visualización ofrece un campo adicional, <em>Eje de reproducción</em>, que nos va a permitir mostrar el gráfico de dispersión para cada uno de los valores de la variable categórica que llevemos a este campo (frecuentemente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_07.jpg"></a>
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_08.jpg"></a>
Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_10.jpg"></a>
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
La visualización nos permite configurar los ejes X e Y, modificar la marca a usar para los puntos (círculos, cuadrados, triángulos o rombos), mostrar o no las etiquetas que representan cada punto, etc.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-deb07197-ef41-4b66-b876-66716a57594a') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>scatter chart</strong> o <strong>gráfico de dispersión</strong> es una visualización integrada en Power BI. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_01.jpg"></a>
Como vemos en el panel de de configuración, partimos de dos valores base, uno para el eje X y otro para el eje Y (campos <em>Eje X</em> y <em>Eje Y</em> respectivamente), desagregados según un criterio principal (campo <em>Detalles</em>), siendo posible agruparlos según un segundo criterio (campo <em>Leyenda</em>).
Comencemos llevando al campo <em>Eje X</em> una medida con la suma de importes de ventas y al campo <em>Eje Y</em> otra medida con el margen medio de ventas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_02.jpg"></a>
Inicialmente se muestra únicamente el punto del plano de coordenadas determinado por los dos valores en cuestión. Si llevamos una variable categórica al campo <em>Detalles</em>, el punto anterior se va a desagregar según los valores de esta variable. Por ejemplo, llevemos a este campo el campo <em>City</em> que contiene la ciudad en la que se realiza cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_03.jpg"></a>
Ahora, para cada ciudad se muestra los valores de ventas (campo <em>Sales</em>, eje X) y margen medio (campo <em>Average Margin</em>, eje Y).
Si llevamos el campo <em>Country</em> (conteniendo el país al que pertenece cada ciudad) al campo <em>Leyenda</em> de la visualización, las burbujas anteriores toman un color que depende del país al que pertenecen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_04.jpg"></a>
Los colores asignados pueden personalizarse en <em>Formato > Colores de datos</em>.
También podemos añadir una nueva dimensión a la visualización controlando el tamaño de cada uno de las burbujas. Para ello deberemos llevar un campo cuantitativo al campo <em>Tamaño</em> de la visualización. Por ejemplo, si llevamos nuestra medida <em>Units</em> (número de unidades vendidas) a este campo, obtenemos el siguiente resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_05.jpg"></a>
Podemos modificar el tamaño medio de las burbujas en <em>Formato > Formas > Tamaño</em> con el fin de que, por ejemplo, el solape no sea tan grande (véase siguiente imagen).
Por supuesto, al mover el cursor encima de una de las burbujas se muestra una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_06.jpg"></a>
La visualización ofrece un campo adicional, <em>Eje de reproducción</em>, que nos va a permitir mostrar el gráfico de dispersión para cada uno de los valores de la variable categórica que llevemos a este campo (frecuentemente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_07.jpg"></a>
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_08.jpg"></a>
Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_10.jpg"></a>
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
La visualización nos permite configurar los ejes X e Y, modificar la marca a usar para los puntos (círculos, cuadrados, triángulos o rombos), mostrar o no las etiquetas que representan cada punto, etc.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-deb07197-ef41-4b66-b876-66716a57594a') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>scatter chart</strong> o <strong>gráfico de dispersión</strong> es una visualización integrada en Power BI. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_01.jpg"></a>
Como vemos en el panel de de configuración, partimos de dos valores base, uno para el eje X y otro para el eje Y (campos <em>Eje X</em> y <em>Eje Y</em> respectivamente), desagregados según un criterio principal (campo <em>Detalles</em>), siendo posible agruparlos según un segundo criterio (campo <em>Leyenda</em>).
Comencemos llevando al campo <em>Eje X</em> una medida con la suma de importes de ventas y al campo <em>Eje Y</em> otra medida con el margen medio de ventas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_02.jpg"></a>
Inicialmente se muestra únicamente el punto del plano de coordenadas determinado por los dos valores en cuestión. Si llevamos una variable categórica al campo <em>Detalles</em>, el punto anterior se va a desagregar según los valores de esta variable. Por ejemplo, llevemos a este campo el campo <em>City</em> que contiene la ciudad en la que se realiza cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_03.jpg"></a>
Ahora, para cada ciudad se muestra los valores de ventas (campo <em>Sales</em>, eje X) y margen medio (campo <em>Average Margin</em>, eje Y).
Si llevamos el campo <em>Country</em> (conteniendo el país al que pertenece cada ciudad) al campo <em>Leyenda</em> de la visualización, las burbujas anteriores toman un color que depende del país al que pertenecen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_04.jpg"></a>
Los colores asignados pueden personalizarse en <em>Formato > Colores de datos</em>.
También podemos añadir una nueva dimensión a la visualización controlando el tamaño de cada uno de las burbujas. Para ello deberemos llevar un campo cuantitativo al campo <em>Tamaño</em> de la visualización. Por ejemplo, si llevamos nuestra medida <em>Units</em> (número de unidades vendidas) a este campo, obtenemos el siguiente resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_05.jpg"></a>
Podemos modificar el tamaño medio de las burbujas en <em>Formato > Formas > Tamaño</em> con el fin de que, por ejemplo, el solape no sea tan grande (véase siguiente imagen).
Por supuesto, al mover el cursor encima de una de las burbujas se muestra una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_06.jpg"></a>
La visualización ofrece un campo adicional, <em>Eje de reproducción</em>, que nos va a permitir mostrar el gráfico de dispersión para cada uno de los valores de la variable categórica que llevemos a este campo (frecuentemente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_07.jpg"></a>
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_08.jpg"></a>
Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_10.jpg"></a>
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
La visualización nos permite configurar los ejes X e Y, modificar la marca a usar para los puntos (círculos, cuadrados, triángulos o rombos), mostrar o no las etiquetas que representan cada punto, etc.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-deb07197-ef41-4b66-b876-66716a57594a') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>scatter chart</strong> o <strong>gráfico de dispersión</strong> es una visualización integrada en Power BI. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_01.jpg"></a>
Como vemos en el panel de de configuración, partimos de dos valores base, uno para el eje X y otro para el eje Y (campos <em>Eje X</em> y <em>Eje Y</em> respectivamente), desagregados según un criterio principal (campo <em>Detalles</em>), siendo posible agruparlos según un segundo criterio (campo <em>Leyenda</em>).
Comencemos llevando al campo <em>Eje X</em> una medida con la suma de importes de ventas y al campo <em>Eje Y</em> otra medida con el margen medio de ventas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_02.jpg"></a>
Inicialmente se muestra únicamente el punto del plano de coordenadas determinado por los dos valores en cuestión. Si llevamos una variable categórica al campo <em>Detalles</em>, el punto anterior se va a desagregar según los valores de esta variable. Por ejemplo, llevemos a este campo el campo <em>City</em> que contiene la ciudad en la que se realiza cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_03.jpg"></a>
Ahora, para cada ciudad se muestra los valores de ventas (campo <em>Sales</em>, eje X) y margen medio (campo <em>Average Margin</em>, eje Y).
Si llevamos el campo <em>Country</em> (conteniendo el país al que pertenece cada ciudad) al campo <em>Leyenda</em> de la visualización, las burbujas anteriores toman un color que depende del país al que pertenecen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_04.jpg"></a>
Los colores asignados pueden personalizarse en <em>Formato > Colores de datos</em>.
También podemos añadir una nueva dimensión a la visualización controlando el tamaño de cada uno de las burbujas. Para ello deberemos llevar un campo cuantitativo al campo <em>Tamaño</em> de la visualización. Por ejemplo, si llevamos nuestra medida <em>Units</em> (número de unidades vendidas) a este campo, obtenemos el siguiente resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_05.jpg"></a>
Podemos modificar el tamaño medio de las burbujas en <em>Formato > Formas > Tamaño</em> con el fin de que, por ejemplo, el solape no sea tan grande (véase siguiente imagen).
Por supuesto, al mover el cursor encima de una de las burbujas se muestra una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_06.jpg"></a>
La visualización ofrece un campo adicional, <em>Eje de reproducción</em>, que nos va a permitir mostrar el gráfico de dispersión para cada uno de los valores de la variable categórica que llevemos a este campo (frecuentemente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_07.jpg"></a>
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_08.jpg"></a>
Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_10.jpg"></a>
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
La visualización nos permite configurar los ejes X e Y, modificar la marca a usar para los puntos (círculos, cuadrados, triángulos o rombos), mostrar o no las etiquetas que representan cada punto, etc.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-c1e6762e-5a58-424b-a79f-b7f5a9dffd46') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>scatter chart</strong> o <strong>gráfico de dispersión</strong> es una visualización integrada en Power BI. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_01.jpg"></a>
Como vemos en el panel de de configuración, partimos de dos valores base, uno para el eje X y otro para el eje Y (campos <em>Eje X</em> y <em>Eje Y</em> respectivamente), desagregados según un criterio principal (campo <em>Detalles</em>), siendo posible agruparlos según un segundo criterio (campo <em>Leyenda</em>).
Comencemos llevando al campo <em>Eje X</em> una medida con la suma de importes de ventas y al campo <em>Eje Y</em> otra medida con el margen medio de ventas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_02.jpg"></a>
Inicialmente se muestra únicamente el punto del plano de coordenadas determinado por los dos valores en cuestión. Si llevamos una variable categórica al campo <em>Detalles</em>, el punto anterior se va a desagregar según los valores de esta variable. Por ejemplo, llevemos a este campo el campo <em>City</em> que contiene la ciudad en la que se realiza cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_03.jpg"></a>
Ahora, para cada ciudad se muestra los valores de ventas (campo <em>Sales</em>, eje X) y margen medio (campo <em>Average Margin</em>, eje Y).
Si llevamos el campo <em>Country</em> (conteniendo el país al que pertenece cada ciudad) al campo <em>Leyenda</em> de la visualización, las burbujas anteriores toman un color que depende del país al que pertenecen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_04.jpg"></a>
Los colores asignados pueden personalizarse en <em>Formato > Colores de datos</em>.
También podemos añadir una nueva dimensión a la visualización controlando el tamaño de cada uno de las burbujas. Para ello deberemos llevar un campo cuantitativo al campo <em>Tamaño</em> de la visualización. Por ejemplo, si llevamos nuestra medida <em>Units</em> (número de unidades vendidas) a este campo, obtenemos el siguiente resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_05.jpg"></a>
Podemos modificar el tamaño medio de las burbujas en <em>Formato > Formas > Tamaño</em> con el fin de que, por ejemplo, el solape no sea tan grande (véase siguiente imagen).
Por supuesto, al mover el cursor encima de una de las burbujas se muestra una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_06.jpg"></a>
La visualización ofrece un campo adicional, <em>Eje de reproducción</em>, que nos va a permitir mostrar el gráfico de dispersión para cada uno de los valores de la variable categórica que llevemos a este campo (frecuentemente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_07.jpg"></a>
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_08.jpg"></a>
Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_10.jpg"></a>
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
La visualización nos permite configurar los ejes X e Y, modificar la marca a usar para los puntos (círculos, cuadrados, triángulos o rombos), mostrar o no las etiquetas que representan cada punto, etc.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-c1e6762e-5a58-424b-a79f-b7f5a9dffd46') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>scatter chart</strong> o <strong>gráfico de dispersión</strong> es una visualización integrada en Power BI. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_01.jpg"></a>
Como vemos en el panel de de configuración, partimos de dos valores base, uno para el eje X y otro para el eje Y (campos <em>Eje X</em> y <em>Eje Y</em> respectivamente), desagregados según un criterio principal (campo <em>Detalles</em>), siendo posible agruparlos según un segundo criterio (campo <em>Leyenda</em>).
Comencemos llevando al campo <em>Eje X</em> una medida con la suma de importes de ventas y al campo <em>Eje Y</em> otra medida con el margen medio de ventas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_02.jpg"></a>
Inicialmente se muestra únicamente el punto del plano de coordenadas determinado por los dos valores en cuestión. Si llevamos una variable categórica al campo <em>Detalles</em>, el punto anterior se va a desagregar según los valores de esta variable. Por ejemplo, llevemos a este campo el campo <em>City</em> que contiene la ciudad en la que se realiza cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_03.jpg"></a>
Ahora, para cada ciudad se muestra los valores de ventas (campo <em>Sales</em>, eje X) y margen medio (campo <em>Average Margin</em>, eje Y).
Si llevamos el campo <em>Country</em> (conteniendo el país al que pertenece cada ciudad) al campo <em>Leyenda</em> de la visualización, las burbujas anteriores toman un color que depende del país al que pertenecen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_04.jpg"></a>
Los colores asignados pueden personalizarse en <em>Formato > Colores de datos</em>.
También podemos añadir una nueva dimensión a la visualización controlando el tamaño de cada uno de las burbujas. Para ello deberemos llevar un campo cuantitativo al campo <em>Tamaño</em> de la visualización. Por ejemplo, si llevamos nuestra medida <em>Units</em> (número de unidades vendidas) a este campo, obtenemos el siguiente resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_05.jpg"></a>
Podemos modificar el tamaño medio de las burbujas en <em>Formato > Formas > Tamaño</em> con el fin de que, por ejemplo, el solape no sea tan grande (véase siguiente imagen).
Por supuesto, al mover el cursor encima de una de las burbujas se muestra una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_06.jpg"></a>
La visualización ofrece un campo adicional, <em>Eje de reproducción</em>, que nos va a permitir mostrar el gráfico de dispersión para cada uno de los valores de la variable categórica que llevemos a este campo (frecuentemente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_07.jpg"></a>
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_08.jpg"></a>
Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_10.jpg"></a>
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
La visualización nos permite configurar los ejes X e Y, modificar la marca a usar para los puntos (círculos, cuadrados, triángulos o rombos), mostrar o no las etiquetas que representan cada punto, etc.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-c1e6762e-5a58-424b-a79f-b7f5a9dffd46') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>scatter chart</strong> o <strong>gráfico de dispersión</strong> es una visualización integrada en Power BI. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_01.jpg"></a>
Como vemos en el panel de de configuración, partimos de dos valores base, uno para el eje X y otro para el eje Y (campos <em>Eje X</em> y <em>Eje Y</em> respectivamente), desagregados según un criterio principal (campo <em>Detalles</em>), siendo posible agruparlos según un segundo criterio (campo <em>Leyenda</em>).
Comencemos llevando al campo <em>Eje X</em> una medida con la suma de importes de ventas y al campo <em>Eje Y</em> otra medida con el margen medio de ventas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_02.jpg"></a>
Inicialmente se muestra únicamente el punto del plano de coordenadas determinado por los dos valores en cuestión. Si llevamos una variable categórica al campo <em>Detalles</em>, el punto anterior se va a desagregar según los valores de esta variable. Por ejemplo, llevemos a este campo el campo <em>City</em> que contiene la ciudad en la que se realiza cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_03.jpg"></a>
Ahora, para cada ciudad se muestra los valores de ventas (campo <em>Sales</em>, eje X) y margen medio (campo <em>Average Margin</em>, eje Y).
Si llevamos el campo <em>Country</em> (conteniendo el país al que pertenece cada ciudad) al campo <em>Leyenda</em> de la visualización, las burbujas anteriores toman un color que depende del país al que pertenecen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_04.jpg"></a>
Los colores asignados pueden personalizarse en <em>Formato > Colores de datos</em>.
También podemos añadir una nueva dimensión a la visualización controlando el tamaño de cada uno de las burbujas. Para ello deberemos llevar un campo cuantitativo al campo <em>Tamaño</em> de la visualización. Por ejemplo, si llevamos nuestra medida <em>Units</em> (número de unidades vendidas) a este campo, obtenemos el siguiente resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_05.jpg"></a>
Podemos modificar el tamaño medio de las burbujas en <em>Formato > Formas > Tamaño</em> con el fin de que, por ejemplo, el solape no sea tan grande (véase siguiente imagen).
Por supuesto, al mover el cursor encima de una de las burbujas se muestra una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_06.jpg"></a>
La visualización ofrece un campo adicional, <em>Eje de reproducción</em>, que nos va a permitir mostrar el gráfico de dispersión para cada uno de los valores de la variable categórica que llevemos a este campo (frecuentemente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_07.jpg"></a>
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_08.jpg"></a>
Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_10.jpg"></a>
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
La visualización nos permite configurar los ejes X e Y, modificar la marca a usar para los puntos (círculos, cuadrados, triángulos o rombos), mostrar o no las etiquetas que representan cada punto, etc.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-c1e6762e-5a58-424b-a79f-b7f5a9dffd46') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>scatter chart</strong> o <strong>gráfico de dispersión</strong> es una visualización integrada en Power BI. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_01.jpg"></a>
Como vemos en el panel de de configuración, partimos de dos valores base, uno para el eje X y otro para el eje Y (campos <em>Eje X</em> y <em>Eje Y</em> respectivamente), desagregados según un criterio principal (campo <em>Detalles</em>), siendo posible agruparlos según un segundo criterio (campo <em>Leyenda</em>).
Comencemos llevando al campo <em>Eje X</em> una medida con la suma de importes de ventas y al campo <em>Eje Y</em> otra medida con el margen medio de ventas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_02.jpg"></a>
Inicialmente se muestra únicamente el punto del plano de coordenadas determinado por los dos valores en cuestión. Si llevamos una variable categórica al campo <em>Detalles</em>, el punto anterior se va a desagregar según los valores de esta variable. Por ejemplo, llevemos a este campo el campo <em>City</em> que contiene la ciudad en la que se realiza cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_03.jpg"></a>
Ahora, para cada ciudad se muestra los valores de ventas (campo <em>Sales</em>, eje X) y margen medio (campo <em>Average Margin</em>, eje Y).
Si llevamos el campo <em>Country</em> (conteniendo el país al que pertenece cada ciudad) al campo <em>Leyenda</em> de la visualización, las burbujas anteriores toman un color que depende del país al que pertenecen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_04.jpg"></a>
Los colores asignados pueden personalizarse en <em>Formato > Colores de datos</em>.
También podemos añadir una nueva dimensión a la visualización controlando el tamaño de cada uno de las burbujas. Para ello deberemos llevar un campo cuantitativo al campo <em>Tamaño</em> de la visualización. Por ejemplo, si llevamos nuestra medida <em>Units</em> (número de unidades vendidas) a este campo, obtenemos el siguiente resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_05.jpg"></a>
Podemos modificar el tamaño medio de las burbujas en <em>Formato > Formas > Tamaño</em> con el fin de que, por ejemplo, el solape no sea tan grande (véase siguiente imagen).
Por supuesto, al mover el cursor encima de una de las burbujas se muestra una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_06.jpg"></a>
La visualización ofrece un campo adicional, <em>Eje de reproducción</em>, que nos va a permitir mostrar el gráfico de dispersión para cada uno de los valores de la variable categórica que llevemos a este campo (frecuentemente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_07.jpg"></a>
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_08.jpg"></a>
Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_10.jpg"></a>
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
La visualización nos permite configurar los ejes X e Y, modificar la marca a usar para los puntos (círculos, cuadrados, triángulos o rombos), mostrar o no las etiquetas que representan cada punto, etc.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-c80d9e0d-d708-475b-8a2a-5ec00b3d82d5') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>scatter chart</strong> o <strong>gráfico de dispersión</strong> es una visualización integrada en Power BI. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_01.jpg"></a>
Como vemos en el panel de de configuración, partimos de dos valores base, uno para el eje X y otro para el eje Y (campos <em>Eje X</em> y <em>Eje Y</em> respectivamente), desagregados según un criterio principal (campo <em>Detalles</em>), siendo posible agruparlos según un segundo criterio (campo <em>Leyenda</em>).
Comencemos llevando al campo <em>Eje X</em> una medida con la suma de importes de ventas y al campo <em>Eje Y</em> otra medida con el margen medio de ventas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_02.jpg"></a>
Inicialmente se muestra únicamente el punto del plano de coordenadas determinado por los dos valores en cuestión. Si llevamos una variable categórica al campo <em>Detalles</em>, el punto anterior se va a desagregar según los valores de esta variable. Por ejemplo, llevemos a este campo el campo <em>City</em> que contiene la ciudad en la que se realiza cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_03.jpg"></a>
Ahora, para cada ciudad se muestra los valores de ventas (campo <em>Sales</em>, eje X) y margen medio (campo <em>Average Margin</em>, eje Y).
Si llevamos el campo <em>Country</em> (conteniendo el país al que pertenece cada ciudad) al campo <em>Leyenda</em> de la visualización, las burbujas anteriores toman un color que depende del país al que pertenecen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_04.jpg"></a>
Los colores asignados pueden personalizarse en <em>Formato > Colores de datos</em>.
También podemos añadir una nueva dimensión a la visualización controlando el tamaño de cada uno de las burbujas. Para ello deberemos llevar un campo cuantitativo al campo <em>Tamaño</em> de la visualización. Por ejemplo, si llevamos nuestra medida <em>Units</em> (número de unidades vendidas) a este campo, obtenemos el siguiente resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_05.jpg"></a>
Podemos modificar el tamaño medio de las burbujas en <em>Formato > Formas > Tamaño</em> con el fin de que, por ejemplo, el solape no sea tan grande (véase siguiente imagen).
Por supuesto, al mover el cursor encima de una de las burbujas se muestra una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_06.jpg"></a>
La visualización ofrece un campo adicional, <em>Eje de reproducción</em>, que nos va a permitir mostrar el gráfico de dispersión para cada uno de los valores de la variable categórica que llevemos a este campo (frecuentemente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_07.jpg"></a>
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_08.jpg"></a>
Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_10.jpg"></a>
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
La visualización nos permite configurar los ejes X e Y, modificar la marca a usar para los puntos (círculos, cuadrados, triángulos o rombos), mostrar o no las etiquetas que representan cada punto, etc.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-c80d9e0d-d708-475b-8a2a-5ec00b3d82d5') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>scatter chart</strong> o <strong>gráfico de dispersión</strong> es una visualización integrada en Power BI. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_01.jpg"></a>
Como vemos en el panel de de configuración, partimos de dos valores base, uno para el eje X y otro para el eje Y (campos <em>Eje X</em> y <em>Eje Y</em> respectivamente), desagregados según un criterio principal (campo <em>Detalles</em>), siendo posible agruparlos según un segundo criterio (campo <em>Leyenda</em>).
Comencemos llevando al campo <em>Eje X</em> una medida con la suma de importes de ventas y al campo <em>Eje Y</em> otra medida con el margen medio de ventas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_02.jpg"></a>
Inicialmente se muestra únicamente el punto del plano de coordenadas determinado por los dos valores en cuestión. Si llevamos una variable categórica al campo <em>Detalles</em>, el punto anterior se va a desagregar según los valores de esta variable. Por ejemplo, llevemos a este campo el campo <em>City</em> que contiene la ciudad en la que se realiza cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_03.jpg"></a>
Ahora, para cada ciudad se muestra los valores de ventas (campo <em>Sales</em>, eje X) y margen medio (campo <em>Average Margin</em>, eje Y).
Si llevamos el campo <em>Country</em> (conteniendo el país al que pertenece cada ciudad) al campo <em>Leyenda</em> de la visualización, las burbujas anteriores toman un color que depende del país al que pertenecen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_04.jpg"></a>
Los colores asignados pueden personalizarse en <em>Formato > Colores de datos</em>.
También podemos añadir una nueva dimensión a la visualización controlando el tamaño de cada uno de las burbujas. Para ello deberemos llevar un campo cuantitativo al campo <em>Tamaño</em> de la visualización. Por ejemplo, si llevamos nuestra medida <em>Units</em> (número de unidades vendidas) a este campo, obtenemos el siguiente resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_05.jpg"></a>
Podemos modificar el tamaño medio de las burbujas en <em>Formato > Formas > Tamaño</em> con el fin de que, por ejemplo, el solape no sea tan grande (véase siguiente imagen).
Por supuesto, al mover el cursor encima de una de las burbujas se muestra una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_06.jpg"></a>
La visualización ofrece un campo adicional, <em>Eje de reproducción</em>, que nos va a permitir mostrar el gráfico de dispersión para cada uno de los valores de la variable categórica que llevemos a este campo (frecuentemente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_07.jpg"></a>
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_08.jpg"></a>
Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_10.jpg"></a>
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
La visualización nos permite configurar los ejes X e Y, modificar la marca a usar para los puntos (círculos, cuadrados, triángulos o rombos), mostrar o no las etiquetas que representan cada punto, etc.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-c80d9e0d-d708-475b-8a2a-5ec00b3d82d5') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>scatter chart</strong> o <strong>gráfico de dispersión</strong> es una visualización integrada en Power BI. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_01.jpg"></a>
Como vemos en el panel de de configuración, partimos de dos valores base, uno para el eje X y otro para el eje Y (campos <em>Eje X</em> y <em>Eje Y</em> respectivamente), desagregados según un criterio principal (campo <em>Detalles</em>), siendo posible agruparlos según un segundo criterio (campo <em>Leyenda</em>).
Comencemos llevando al campo <em>Eje X</em> una medida con la suma de importes de ventas y al campo <em>Eje Y</em> otra medida con el margen medio de ventas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_02.jpg"></a>
Inicialmente se muestra únicamente el punto del plano de coordenadas determinado por los dos valores en cuestión. Si llevamos una variable categórica al campo <em>Detalles</em>, el punto anterior se va a desagregar según los valores de esta variable. Por ejemplo, llevemos a este campo el campo <em>City</em> que contiene la ciudad en la que se realiza cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_03.jpg"></a>
Ahora, para cada ciudad se muestra los valores de ventas (campo <em>Sales</em>, eje X) y margen medio (campo <em>Average Margin</em>, eje Y).
Si llevamos el campo <em>Country</em> (conteniendo el país al que pertenece cada ciudad) al campo <em>Leyenda</em> de la visualización, las burbujas anteriores toman un color que depende del país al que pertenecen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_04.jpg"></a>
Los colores asignados pueden personalizarse en <em>Formato > Colores de datos</em>.
También podemos añadir una nueva dimensión a la visualización controlando el tamaño de cada uno de las burbujas. Para ello deberemos llevar un campo cuantitativo al campo <em>Tamaño</em> de la visualización. Por ejemplo, si llevamos nuestra medida <em>Units</em> (número de unidades vendidas) a este campo, obtenemos el siguiente resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_05.jpg"></a>
Podemos modificar el tamaño medio de las burbujas en <em>Formato > Formas > Tamaño</em> con el fin de que, por ejemplo, el solape no sea tan grande (véase siguiente imagen).
Por supuesto, al mover el cursor encima de una de las burbujas se muestra una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_06.jpg"></a>
La visualización ofrece un campo adicional, <em>Eje de reproducción</em>, que nos va a permitir mostrar el gráfico de dispersión para cada uno de los valores de la variable categórica que llevemos a este campo (frecuentemente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_07.jpg"></a>
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_08.jpg"></a>
Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_10.jpg"></a>
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
La visualización nos permite configurar los ejes X e Y, modificar la marca a usar para los puntos (círculos, cuadrados, triángulos o rombos), mostrar o no las etiquetas que representan cada punto, etc.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-c80d9e0d-d708-475b-8a2a-5ec00b3d82d5') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>scatter chart</strong> o <strong>gráfico de dispersión</strong> es una visualización integrada en Power BI. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_01.jpg"></a>
Como vemos en el panel de de configuración, partimos de dos valores base, uno para el eje X y otro para el eje Y (campos <em>Eje X</em> y <em>Eje Y</em> respectivamente), desagregados según un criterio principal (campo <em>Detalles</em>), siendo posible agruparlos según un segundo criterio (campo <em>Leyenda</em>).
Comencemos llevando al campo <em>Eje X</em> una medida con la suma de importes de ventas y al campo <em>Eje Y</em> otra medida con el margen medio de ventas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_02.jpg"></a>
Inicialmente se muestra únicamente el punto del plano de coordenadas determinado por los dos valores en cuestión. Si llevamos una variable categórica al campo <em>Detalles</em>, el punto anterior se va a desagregar según los valores de esta variable. Por ejemplo, llevemos a este campo el campo <em>City</em> que contiene la ciudad en la que se realiza cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_03.jpg"></a>
Ahora, para cada ciudad se muestra los valores de ventas (campo <em>Sales</em>, eje X) y margen medio (campo <em>Average Margin</em>, eje Y).
Si llevamos el campo <em>Country</em> (conteniendo el país al que pertenece cada ciudad) al campo <em>Leyenda</em> de la visualización, las burbujas anteriores toman un color que depende del país al que pertenecen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_04.jpg"></a>
Los colores asignados pueden personalizarse en <em>Formato > Colores de datos</em>.
También podemos añadir una nueva dimensión a la visualización controlando el tamaño de cada uno de las burbujas. Para ello deberemos llevar un campo cuantitativo al campo <em>Tamaño</em> de la visualización. Por ejemplo, si llevamos nuestra medida <em>Units</em> (número de unidades vendidas) a este campo, obtenemos el siguiente resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_05.jpg"></a>
Podemos modificar el tamaño medio de las burbujas en <em>Formato > Formas > Tamaño</em> con el fin de que, por ejemplo, el solape no sea tan grande (véase siguiente imagen).
Por supuesto, al mover el cursor encima de una de las burbujas se muestra una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_06.jpg"></a>
La visualización ofrece un campo adicional, <em>Eje de reproducción</em>, que nos va a permitir mostrar el gráfico de dispersión para cada uno de los valores de la variable categórica que llevemos a este campo (frecuentemente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_07.jpg"></a>
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_08.jpg"></a>
Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_10.jpg"></a>
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
La visualización nos permite configurar los ejes X e Y, modificar la marca a usar para los puntos (círculos, cuadrados, triángulos o rombos), mostrar o no las etiquetas que representan cada punto, etc.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-e42a3cc2-2e9f-4ad0-982e-bdfdcfdddaff') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>scatter chart</strong> o <strong>gráfico de dispersión</strong> es una visualización integrada en Power BI. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_01.jpg"></a>
Como vemos en el panel de de configuración, partimos de dos valores base, uno para el eje X y otro para el eje Y (campos <em>Eje X</em> y <em>Eje Y</em> respectivamente), desagregados según un criterio principal (campo <em>Detalles</em>), siendo posible agruparlos según un segundo criterio (campo <em>Leyenda</em>).
Comencemos llevando al campo <em>Eje X</em> una medida con la suma de importes de ventas y al campo <em>Eje Y</em> otra medida con el margen medio de ventas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_02.jpg"></a>
Inicialmente se muestra únicamente el punto del plano de coordenadas determinado por los dos valores en cuestión. Si llevamos una variable categórica al campo <em>Detalles</em>, el punto anterior se va a desagregar según los valores de esta variable. Por ejemplo, llevemos a este campo el campo <em>City</em> que contiene la ciudad en la que se realiza cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_03.jpg"></a>
Ahora, para cada ciudad se muestra los valores de ventas (campo <em>Sales</em>, eje X) y margen medio (campo <em>Average Margin</em>, eje Y).
Si llevamos el campo <em>Country</em> (conteniendo el país al que pertenece cada ciudad) al campo <em>Leyenda</em> de la visualización, las burbujas anteriores toman un color que depende del país al que pertenecen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_04.jpg"></a>
Los colores asignados pueden personalizarse en <em>Formato > Colores de datos</em>.
También podemos añadir una nueva dimensión a la visualización controlando el tamaño de cada uno de las burbujas. Para ello deberemos llevar un campo cuantitativo al campo <em>Tamaño</em> de la visualización. Por ejemplo, si llevamos nuestra medida <em>Units</em> (número de unidades vendidas) a este campo, obtenemos el siguiente resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_05.jpg"></a>
Podemos modificar el tamaño medio de las burbujas en <em>Formato > Formas > Tamaño</em> con el fin de que, por ejemplo, el solape no sea tan grande (véase siguiente imagen).
Por supuesto, al mover el cursor encima de una de las burbujas se muestra una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_06.jpg"></a>
La visualización ofrece un campo adicional, <em>Eje de reproducción</em>, que nos va a permitir mostrar el gráfico de dispersión para cada uno de los valores de la variable categórica que llevemos a este campo (frecuentemente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_07.jpg"></a>
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_08.jpg"></a>
Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_10.jpg"></a>
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
La visualización nos permite configurar los ejes X e Y, modificar la marca a usar para los puntos (círculos, cuadrados, triángulos o rombos), mostrar o no las etiquetas que representan cada punto, etc.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-e42a3cc2-2e9f-4ad0-982e-bdfdcfdddaff') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>scatter chart</strong> o <strong>gráfico de dispersión</strong> es una visualización integrada en Power BI. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_01.jpg"></a>
Como vemos en el panel de de configuración, partimos de dos valores base, uno para el eje X y otro para el eje Y (campos <em>Eje X</em> y <em>Eje Y</em> respectivamente), desagregados según un criterio principal (campo <em>Detalles</em>), siendo posible agruparlos según un segundo criterio (campo <em>Leyenda</em>).
Comencemos llevando al campo <em>Eje X</em> una medida con la suma de importes de ventas y al campo <em>Eje Y</em> otra medida con el margen medio de ventas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_02.jpg"></a>
Inicialmente se muestra únicamente el punto del plano de coordenadas determinado por los dos valores en cuestión. Si llevamos una variable categórica al campo <em>Detalles</em>, el punto anterior se va a desagregar según los valores de esta variable. Por ejemplo, llevemos a este campo el campo <em>City</em> que contiene la ciudad en la que se realiza cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_03.jpg"></a>
Ahora, para cada ciudad se muestra los valores de ventas (campo <em>Sales</em>, eje X) y margen medio (campo <em>Average Margin</em>, eje Y).
Si llevamos el campo <em>Country</em> (conteniendo el país al que pertenece cada ciudad) al campo <em>Leyenda</em> de la visualización, las burbujas anteriores toman un color que depende del país al que pertenecen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_04.jpg"></a>
Los colores asignados pueden personalizarse en <em>Formato > Colores de datos</em>.
También podemos añadir una nueva dimensión a la visualización controlando el tamaño de cada uno de las burbujas. Para ello deberemos llevar un campo cuantitativo al campo <em>Tamaño</em> de la visualización. Por ejemplo, si llevamos nuestra medida <em>Units</em> (número de unidades vendidas) a este campo, obtenemos el siguiente resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_05.jpg"></a>
Podemos modificar el tamaño medio de las burbujas en <em>Formato > Formas > Tamaño</em> con el fin de que, por ejemplo, el solape no sea tan grande (véase siguiente imagen).
Por supuesto, al mover el cursor encima de una de las burbujas se muestra una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_06.jpg"></a>
La visualización ofrece un campo adicional, <em>Eje de reproducción</em>, que nos va a permitir mostrar el gráfico de dispersión para cada uno de los valores de la variable categórica que llevemos a este campo (frecuentemente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_07.jpg"></a>
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_08.jpg"></a>
Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_10.jpg"></a>
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
La visualización nos permite configurar los ejes X e Y, modificar la marca a usar para los puntos (círculos, cuadrados, triángulos o rombos), mostrar o no las etiquetas que representan cada punto, etc.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-e42a3cc2-2e9f-4ad0-982e-bdfdcfdddaff') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>scatter chart</strong> o <strong>gráfico de dispersión</strong> es una visualización integrada en Power BI. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_01.jpg"></a>
Como vemos en el panel de de configuración, partimos de dos valores base, uno para el eje X y otro para el eje Y (campos <em>Eje X</em> y <em>Eje Y</em> respectivamente), desagregados según un criterio principal (campo <em>Detalles</em>), siendo posible agruparlos según un segundo criterio (campo <em>Leyenda</em>).
Comencemos llevando al campo <em>Eje X</em> una medida con la suma de importes de ventas y al campo <em>Eje Y</em> otra medida con el margen medio de ventas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_02.jpg"></a>
Inicialmente se muestra únicamente el punto del plano de coordenadas determinado por los dos valores en cuestión. Si llevamos una variable categórica al campo <em>Detalles</em>, el punto anterior se va a desagregar según los valores de esta variable. Por ejemplo, llevemos a este campo el campo <em>City</em> que contiene la ciudad en la que se realiza cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_03.jpg"></a>
Ahora, para cada ciudad se muestra los valores de ventas (campo <em>Sales</em>, eje X) y margen medio (campo <em>Average Margin</em>, eje Y).
Si llevamos el campo <em>Country</em> (conteniendo el país al que pertenece cada ciudad) al campo <em>Leyenda</em> de la visualización, las burbujas anteriores toman un color que depende del país al que pertenecen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_04.jpg"></a>
Los colores asignados pueden personalizarse en <em>Formato > Colores de datos</em>.
También podemos añadir una nueva dimensión a la visualización controlando el tamaño de cada uno de las burbujas. Para ello deberemos llevar un campo cuantitativo al campo <em>Tamaño</em> de la visualización. Por ejemplo, si llevamos nuestra medida <em>Units</em> (número de unidades vendidas) a este campo, obtenemos el siguiente resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_05.jpg"></a>
Podemos modificar el tamaño medio de las burbujas en <em>Formato > Formas > Tamaño</em> con el fin de que, por ejemplo, el solape no sea tan grande (véase siguiente imagen).
Por supuesto, al mover el cursor encima de una de las burbujas se muestra una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_06.jpg"></a>
La visualización ofrece un campo adicional, <em>Eje de reproducción</em>, que nos va a permitir mostrar el gráfico de dispersión para cada uno de los valores de la variable categórica que llevemos a este campo (frecuentemente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_07.jpg"></a>
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_08.jpg"></a>
Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_10.jpg"></a>
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
La visualización nos permite configurar los ejes X e Y, modificar la marca a usar para los puntos (círculos, cuadrados, triángulos o rombos), mostrar o no las etiquetas que representan cada punto, etc.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-e42a3cc2-2e9f-4ad0-982e-bdfdcfdddaff') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>scatter chart</strong> o <strong>gráfico de dispersión</strong> es una visualización integrada en Power BI. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_01.jpg"></a>
Como vemos en el panel de de configuración, partimos de dos valores base, uno para el eje X y otro para el eje Y (campos <em>Eje X</em> y <em>Eje Y</em> respectivamente), desagregados según un criterio principal (campo <em>Detalles</em>), siendo posible agruparlos según un segundo criterio (campo <em>Leyenda</em>).
Comencemos llevando al campo <em>Eje X</em> una medida con la suma de importes de ventas y al campo <em>Eje Y</em> otra medida con el margen medio de ventas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_02.jpg"></a>
Inicialmente se muestra únicamente el punto del plano de coordenadas determinado por los dos valores en cuestión. Si llevamos una variable categórica al campo <em>Detalles</em>, el punto anterior se va a desagregar según los valores de esta variable. Por ejemplo, llevemos a este campo el campo <em>City</em> que contiene la ciudad en la que se realiza cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_03.jpg"></a>
Ahora, para cada ciudad se muestra los valores de ventas (campo <em>Sales</em>, eje X) y margen medio (campo <em>Average Margin</em>, eje Y).
Si llevamos el campo <em>Country</em> (conteniendo el país al que pertenece cada ciudad) al campo <em>Leyenda</em> de la visualización, las burbujas anteriores toman un color que depende del país al que pertenecen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_04.jpg"></a>
Los colores asignados pueden personalizarse en <em>Formato > Colores de datos</em>.
También podemos añadir una nueva dimensión a la visualización controlando el tamaño de cada uno de las burbujas. Para ello deberemos llevar un campo cuantitativo al campo <em>Tamaño</em> de la visualización. Por ejemplo, si llevamos nuestra medida <em>Units</em> (número de unidades vendidas) a este campo, obtenemos el siguiente resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_05.jpg"></a>
Podemos modificar el tamaño medio de las burbujas en <em>Formato > Formas > Tamaño</em> con el fin de que, por ejemplo, el solape no sea tan grande (véase siguiente imagen).
Por supuesto, al mover el cursor encima de una de las burbujas se muestra una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_06.jpg"></a>
La visualización ofrece un campo adicional, <em>Eje de reproducción</em>, que nos va a permitir mostrar el gráfico de dispersión para cada uno de los valores de la variable categórica que llevemos a este campo (frecuentemente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_07.jpg"></a>
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_08.jpg"></a>
Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_10.jpg"></a>
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
La visualización nos permite configurar los ejes X e Y, modificar la marca a usar para los puntos (círculos, cuadrados, triángulos o rombos), mostrar o no las etiquetas que representan cada punto, etc.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-68c04ffa-e0e0-47a2-b7b0-f82aa83cdcf6') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>scatter chart</strong> o <strong>gráfico de dispersión</strong> es una visualización integrada en Power BI. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_01.jpg"></a>
Como vemos en el panel de de configuración, partimos de dos valores base, uno para el eje X y otro para el eje Y (campos <em>Eje X</em> y <em>Eje Y</em> respectivamente), desagregados según un criterio principal (campo <em>Detalles</em>), siendo posible agruparlos según un segundo criterio (campo <em>Leyenda</em>).
Comencemos llevando al campo <em>Eje X</em> una medida con la suma de importes de ventas y al campo <em>Eje Y</em> otra medida con el margen medio de ventas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_02.jpg"></a>
Inicialmente se muestra únicamente el punto del plano de coordenadas determinado por los dos valores en cuestión. Si llevamos una variable categórica al campo <em>Detalles</em>, el punto anterior se va a desagregar según los valores de esta variable. Por ejemplo, llevemos a este campo el campo <em>City</em> que contiene la ciudad en la que se realiza cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_03.jpg"></a>
Ahora, para cada ciudad se muestra los valores de ventas (campo <em>Sales</em>, eje X) y margen medio (campo <em>Average Margin</em>, eje Y).
Si llevamos el campo <em>Country</em> (conteniendo el país al que pertenece cada ciudad) al campo <em>Leyenda</em> de la visualización, las burbujas anteriores toman un color que depende del país al que pertenecen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_04.jpg"></a>
Los colores asignados pueden personalizarse en <em>Formato > Colores de datos</em>.
También podemos añadir una nueva dimensión a la visualización controlando el tamaño de cada uno de las burbujas. Para ello deberemos llevar un campo cuantitativo al campo <em>Tamaño</em> de la visualización. Por ejemplo, si llevamos nuestra medida <em>Units</em> (número de unidades vendidas) a este campo, obtenemos el siguiente resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_05.jpg"></a>
Podemos modificar el tamaño medio de las burbujas en <em>Formato > Formas > Tamaño</em> con el fin de que, por ejemplo, el solape no sea tan grande (véase siguiente imagen).
Por supuesto, al mover el cursor encima de una de las burbujas se muestra una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_06.jpg"></a>
La visualización ofrece un campo adicional, <em>Eje de reproducción</em>, que nos va a permitir mostrar el gráfico de dispersión para cada uno de los valores de la variable categórica que llevemos a este campo (frecuentemente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_07.jpg"></a>
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_08.jpg"></a>
Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_10.jpg"></a>
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
La visualización nos permite configurar los ejes X e Y, modificar la marca a usar para los puntos (círculos, cuadrados, triángulos o rombos), mostrar o no las etiquetas que representan cada punto, etc.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-68c04ffa-e0e0-47a2-b7b0-f82aa83cdcf6') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>scatter chart</strong> o <strong>gráfico de dispersión</strong> es una visualización integrada en Power BI. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_01.jpg"></a>
Como vemos en el panel de de configuración, partimos de dos valores base, uno para el eje X y otro para el eje Y (campos <em>Eje X</em> y <em>Eje Y</em> respectivamente), desagregados según un criterio principal (campo <em>Detalles</em>), siendo posible agruparlos según un segundo criterio (campo <em>Leyenda</em>).
Comencemos llevando al campo <em>Eje X</em> una medida con la suma de importes de ventas y al campo <em>Eje Y</em> otra medida con el margen medio de ventas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_02.jpg"></a>
Inicialmente se muestra únicamente el punto del plano de coordenadas determinado por los dos valores en cuestión. Si llevamos una variable categórica al campo <em>Detalles</em>, el punto anterior se va a desagregar según los valores de esta variable. Por ejemplo, llevemos a este campo el campo <em>City</em> que contiene la ciudad en la que se realiza cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_03.jpg"></a>
Ahora, para cada ciudad se muestra los valores de ventas (campo <em>Sales</em>, eje X) y margen medio (campo <em>Average Margin</em>, eje Y).
Si llevamos el campo <em>Country</em> (conteniendo el país al que pertenece cada ciudad) al campo <em>Leyenda</em> de la visualización, las burbujas anteriores toman un color que depende del país al que pertenecen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_04.jpg"></a>
Los colores asignados pueden personalizarse en <em>Formato > Colores de datos</em>.
También podemos añadir una nueva dimensión a la visualización controlando el tamaño de cada uno de las burbujas. Para ello deberemos llevar un campo cuantitativo al campo <em>Tamaño</em> de la visualización. Por ejemplo, si llevamos nuestra medida <em>Units</em> (número de unidades vendidas) a este campo, obtenemos el siguiente resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_05.jpg"></a>
Podemos modificar el tamaño medio de las burbujas en <em>Formato > Formas > Tamaño</em> con el fin de que, por ejemplo, el solape no sea tan grande (véase siguiente imagen).
Por supuesto, al mover el cursor encima de una de las burbujas se muestra una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_06.jpg"></a>
La visualización ofrece un campo adicional, <em>Eje de reproducción</em>, que nos va a permitir mostrar el gráfico de dispersión para cada uno de los valores de la variable categórica que llevemos a este campo (frecuentemente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_07.jpg"></a>
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_08.jpg"></a>
Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_10.jpg"></a>
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
La visualización nos permite configurar los ejes X e Y, modificar la marca a usar para los puntos (círculos, cuadrados, triángulos o rombos), mostrar o no las etiquetas que representan cada punto, etc.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-68c04ffa-e0e0-47a2-b7b0-f82aa83cdcf6') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>scatter chart</strong> o <strong>gráfico de dispersión</strong> es una visualización integrada en Power BI. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_01.jpg"></a>
Como vemos en el panel de de configuración, partimos de dos valores base, uno para el eje X y otro para el eje Y (campos <em>Eje X</em> y <em>Eje Y</em> respectivamente), desagregados según un criterio principal (campo <em>Detalles</em>), siendo posible agruparlos según un segundo criterio (campo <em>Leyenda</em>).
Comencemos llevando al campo <em>Eje X</em> una medida con la suma de importes de ventas y al campo <em>Eje Y</em> otra medida con el margen medio de ventas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_02.jpg"></a>
Inicialmente se muestra únicamente el punto del plano de coordenadas determinado por los dos valores en cuestión. Si llevamos una variable categórica al campo <em>Detalles</em>, el punto anterior se va a desagregar según los valores de esta variable. Por ejemplo, llevemos a este campo el campo <em>City</em> que contiene la ciudad en la que se realiza cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_03.jpg"></a>
Ahora, para cada ciudad se muestra los valores de ventas (campo <em>Sales</em>, eje X) y margen medio (campo <em>Average Margin</em>, eje Y).
Si llevamos el campo <em>Country</em> (conteniendo el país al que pertenece cada ciudad) al campo <em>Leyenda</em> de la visualización, las burbujas anteriores toman un color que depende del país al que pertenecen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_04.jpg"></a>
Los colores asignados pueden personalizarse en <em>Formato > Colores de datos</em>.
También podemos añadir una nueva dimensión a la visualización controlando el tamaño de cada uno de las burbujas. Para ello deberemos llevar un campo cuantitativo al campo <em>Tamaño</em> de la visualización. Por ejemplo, si llevamos nuestra medida <em>Units</em> (número de unidades vendidas) a este campo, obtenemos el siguiente resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_05.jpg"></a>
Podemos modificar el tamaño medio de las burbujas en <em>Formato > Formas > Tamaño</em> con el fin de que, por ejemplo, el solape no sea tan grande (véase siguiente imagen).
Por supuesto, al mover el cursor encima de una de las burbujas se muestra una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_06.jpg"></a>
La visualización ofrece un campo adicional, <em>Eje de reproducción</em>, que nos va a permitir mostrar el gráfico de dispersión para cada uno de los valores de la variable categórica que llevemos a este campo (frecuentemente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_07.jpg"></a>
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_08.jpg"></a>
Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_10.jpg"></a>
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
La visualización nos permite configurar los ejes X e Y, modificar la marca a usar para los puntos (círculos, cuadrados, triángulos o rombos), mostrar o no las etiquetas que representan cada punto, etc.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-68c04ffa-e0e0-47a2-b7b0-f82aa83cdcf6') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>scatter chart</strong> o <strong>gráfico de dispersión</strong> es una visualización integrada en Power BI. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_01.jpg"></a>
Como vemos en el panel de de configuración, partimos de dos valores base, uno para el eje X y otro para el eje Y (campos <em>Eje X</em> y <em>Eje Y</em> respectivamente), desagregados según un criterio principal (campo <em>Detalles</em>), siendo posible agruparlos según un segundo criterio (campo <em>Leyenda</em>).
Comencemos llevando al campo <em>Eje X</em> una medida con la suma de importes de ventas y al campo <em>Eje Y</em> otra medida con el margen medio de ventas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_02.jpg"></a>
Inicialmente se muestra únicamente el punto del plano de coordenadas determinado por los dos valores en cuestión. Si llevamos una variable categórica al campo <em>Detalles</em>, el punto anterior se va a desagregar según los valores de esta variable. Por ejemplo, llevemos a este campo el campo <em>City</em> que contiene la ciudad en la que se realiza cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_03.jpg"></a>
Ahora, para cada ciudad se muestra los valores de ventas (campo <em>Sales</em>, eje X) y margen medio (campo <em>Average Margin</em>, eje Y).
Si llevamos el campo <em>Country</em> (conteniendo el país al que pertenece cada ciudad) al campo <em>Leyenda</em> de la visualización, las burbujas anteriores toman un color que depende del país al que pertenecen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_04.jpg"></a>
Los colores asignados pueden personalizarse en <em>Formato > Colores de datos</em>.
También podemos añadir una nueva dimensión a la visualización controlando el tamaño de cada uno de las burbujas. Para ello deberemos llevar un campo cuantitativo al campo <em>Tamaño</em> de la visualización. Por ejemplo, si llevamos nuestra medida <em>Units</em> (número de unidades vendidas) a este campo, obtenemos el siguiente resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_05.jpg"></a>
Podemos modificar el tamaño medio de las burbujas en <em>Formato > Formas > Tamaño</em> con el fin de que, por ejemplo, el solape no sea tan grande (véase siguiente imagen).
Por supuesto, al mover el cursor encima de una de las burbujas se muestra una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_06.jpg"></a>
La visualización ofrece un campo adicional, <em>Eje de reproducción</em>, que nos va a permitir mostrar el gráfico de dispersión para cada uno de los valores de la variable categórica que llevemos a este campo (frecuentemente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_07.jpg"></a>
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_08.jpg"></a>
Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_10.jpg"></a>
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
La visualización nos permite configurar los ejes X e Y, modificar la marca a usar para los puntos (círculos, cuadrados, triángulos o rombos), mostrar o no las etiquetas que representan cada punto, etc.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-80551b77-2037-4a9c-a61f-57e8f7d0c6e4') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>scatter chart</strong> o <strong>gráfico de dispersión</strong> es una visualización integrada en Power BI. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_01.jpg"></a>
Como vemos en el panel de de configuración, partimos de dos valores base, uno para el eje X y otro para el eje Y (campos <em>Eje X</em> y <em>Eje Y</em> respectivamente), desagregados según un criterio principal (campo <em>Detalles</em>), siendo posible agruparlos según un segundo criterio (campo <em>Leyenda</em>).
Comencemos llevando al campo <em>Eje X</em> una medida con la suma de importes de ventas y al campo <em>Eje Y</em> otra medida con el margen medio de ventas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_02.jpg"></a>
Inicialmente se muestra únicamente el punto del plano de coordenadas determinado por los dos valores en cuestión. Si llevamos una variable categórica al campo <em>Detalles</em>, el punto anterior se va a desagregar según los valores de esta variable. Por ejemplo, llevemos a este campo el campo <em>City</em> que contiene la ciudad en la que se realiza cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_03.jpg"></a>
Ahora, para cada ciudad se muestra los valores de ventas (campo <em>Sales</em>, eje X) y margen medio (campo <em>Average Margin</em>, eje Y).
Si llevamos el campo <em>Country</em> (conteniendo el país al que pertenece cada ciudad) al campo <em>Leyenda</em> de la visualización, las burbujas anteriores toman un color que depende del país al que pertenecen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_04.jpg"></a>
Los colores asignados pueden personalizarse en <em>Formato > Colores de datos</em>.
También podemos añadir una nueva dimensión a la visualización controlando el tamaño de cada uno de las burbujas. Para ello deberemos llevar un campo cuantitativo al campo <em>Tamaño</em> de la visualización. Por ejemplo, si llevamos nuestra medida <em>Units</em> (número de unidades vendidas) a este campo, obtenemos el siguiente resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_05.jpg"></a>
Podemos modificar el tamaño medio de las burbujas en <em>Formato > Formas > Tamaño</em> con el fin de que, por ejemplo, el solape no sea tan grande (véase siguiente imagen).
Por supuesto, al mover el cursor encima de una de las burbujas se muestra una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_06.jpg"></a>
La visualización ofrece un campo adicional, <em>Eje de reproducción</em>, que nos va a permitir mostrar el gráfico de dispersión para cada uno de los valores de la variable categórica que llevemos a este campo (frecuentemente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_07.jpg"></a>
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_08.jpg"></a>
Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_10.jpg"></a>
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
La visualización nos permite configurar los ejes X e Y, modificar la marca a usar para los puntos (círculos, cuadrados, triángulos o rombos), mostrar o no las etiquetas que representan cada punto, etc.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-80551b77-2037-4a9c-a61f-57e8f7d0c6e4') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>scatter chart</strong> o <strong>gráfico de dispersión</strong> es una visualización integrada en Power BI. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_01.jpg"></a>
Como vemos en el panel de de configuración, partimos de dos valores base, uno para el eje X y otro para el eje Y (campos <em>Eje X</em> y <em>Eje Y</em> respectivamente), desagregados según un criterio principal (campo <em>Detalles</em>), siendo posible agruparlos según un segundo criterio (campo <em>Leyenda</em>).
Comencemos llevando al campo <em>Eje X</em> una medida con la suma de importes de ventas y al campo <em>Eje Y</em> otra medida con el margen medio de ventas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_02.jpg"></a>
Inicialmente se muestra únicamente el punto del plano de coordenadas determinado por los dos valores en cuestión. Si llevamos una variable categórica al campo <em>Detalles</em>, el punto anterior se va a desagregar según los valores de esta variable. Por ejemplo, llevemos a este campo el campo <em>City</em> que contiene la ciudad en la que se realiza cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_03.jpg"></a>
Ahora, para cada ciudad se muestra los valores de ventas (campo <em>Sales</em>, eje X) y margen medio (campo <em>Average Margin</em>, eje Y).
Si llevamos el campo <em>Country</em> (conteniendo el país al que pertenece cada ciudad) al campo <em>Leyenda</em> de la visualización, las burbujas anteriores toman un color que depende del país al que pertenecen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_04.jpg"></a>
Los colores asignados pueden personalizarse en <em>Formato > Colores de datos</em>.
También podemos añadir una nueva dimensión a la visualización controlando el tamaño de cada uno de las burbujas. Para ello deberemos llevar un campo cuantitativo al campo <em>Tamaño</em> de la visualización. Por ejemplo, si llevamos nuestra medida <em>Units</em> (número de unidades vendidas) a este campo, obtenemos el siguiente resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_05.jpg"></a>
Podemos modificar el tamaño medio de las burbujas en <em>Formato > Formas > Tamaño</em> con el fin de que, por ejemplo, el solape no sea tan grande (véase siguiente imagen).
Por supuesto, al mover el cursor encima de una de las burbujas se muestra una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_06.jpg"></a>
La visualización ofrece un campo adicional, <em>Eje de reproducción</em>, que nos va a permitir mostrar el gráfico de dispersión para cada uno de los valores de la variable categórica que llevemos a este campo (frecuentemente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_07.jpg"></a>
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_08.jpg"></a>
Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_10.jpg"></a>
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
La visualización nos permite configurar los ejes X e Y, modificar la marca a usar para los puntos (círculos, cuadrados, triángulos o rombos), mostrar o no las etiquetas que representan cada punto, etc.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-80551b77-2037-4a9c-a61f-57e8f7d0c6e4') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>scatter chart</strong> o <strong>gráfico de dispersión</strong> es una visualización integrada en Power BI. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_01.jpg"></a>
Como vemos en el panel de de configuración, partimos de dos valores base, uno para el eje X y otro para el eje Y (campos <em>Eje X</em> y <em>Eje Y</em> respectivamente), desagregados según un criterio principal (campo <em>Detalles</em>), siendo posible agruparlos según un segundo criterio (campo <em>Leyenda</em>).
Comencemos llevando al campo <em>Eje X</em> una medida con la suma de importes de ventas y al campo <em>Eje Y</em> otra medida con el margen medio de ventas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_02.jpg"></a>
Inicialmente se muestra únicamente el punto del plano de coordenadas determinado por los dos valores en cuestión. Si llevamos una variable categórica al campo <em>Detalles</em>, el punto anterior se va a desagregar según los valores de esta variable. Por ejemplo, llevemos a este campo el campo <em>City</em> que contiene la ciudad en la que se realiza cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_03.jpg"></a>
Ahora, para cada ciudad se muestra los valores de ventas (campo <em>Sales</em>, eje X) y margen medio (campo <em>Average Margin</em>, eje Y).
Si llevamos el campo <em>Country</em> (conteniendo el país al que pertenece cada ciudad) al campo <em>Leyenda</em> de la visualización, las burbujas anteriores toman un color que depende del país al que pertenecen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_04.jpg"></a>
Los colores asignados pueden personalizarse en <em>Formato > Colores de datos</em>.
También podemos añadir una nueva dimensión a la visualización controlando el tamaño de cada uno de las burbujas. Para ello deberemos llevar un campo cuantitativo al campo <em>Tamaño</em> de la visualización. Por ejemplo, si llevamos nuestra medida <em>Units</em> (número de unidades vendidas) a este campo, obtenemos el siguiente resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_05.jpg"></a>
Podemos modificar el tamaño medio de las burbujas en <em>Formato > Formas > Tamaño</em> con el fin de que, por ejemplo, el solape no sea tan grande (véase siguiente imagen).
Por supuesto, al mover el cursor encima de una de las burbujas se muestra una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_06.jpg"></a>
La visualización ofrece un campo adicional, <em>Eje de reproducción</em>, que nos va a permitir mostrar el gráfico de dispersión para cada uno de los valores de la variable categórica que llevemos a este campo (frecuentemente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_07.jpg"></a>
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_08.jpg"></a>
Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_10.jpg"></a>
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
La visualización nos permite configurar los ejes X e Y, modificar la marca a usar para los puntos (círculos, cuadrados, triángulos o rombos), mostrar o no las etiquetas que representan cada punto, etc.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-80551b77-2037-4a9c-a61f-57e8f7d0c6e4') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>scatter chart</strong> o <strong>gráfico de dispersión</strong> es una visualización integrada en Power BI. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_01.jpg"></a>
Como vemos en el panel de de configuración, partimos de dos valores base, uno para el eje X y otro para el eje Y (campos <em>Eje X</em> y <em>Eje Y</em> respectivamente), desagregados según un criterio principal (campo <em>Detalles</em>), siendo posible agruparlos según un segundo criterio (campo <em>Leyenda</em>).
Comencemos llevando al campo <em>Eje X</em> una medida con la suma de importes de ventas y al campo <em>Eje Y</em> otra medida con el margen medio de ventas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_02.jpg"></a>
Inicialmente se muestra únicamente el punto del plano de coordenadas determinado por los dos valores en cuestión. Si llevamos una variable categórica al campo <em>Detalles</em>, el punto anterior se va a desagregar según los valores de esta variable. Por ejemplo, llevemos a este campo el campo <em>City</em> que contiene la ciudad en la que se realiza cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_03.jpg"></a>
Ahora, para cada ciudad se muestra los valores de ventas (campo <em>Sales</em>, eje X) y margen medio (campo <em>Average Margin</em>, eje Y).
Si llevamos el campo <em>Country</em> (conteniendo el país al que pertenece cada ciudad) al campo <em>Leyenda</em> de la visualización, las burbujas anteriores toman un color que depende del país al que pertenecen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_04.jpg"></a>
Los colores asignados pueden personalizarse en <em>Formato > Colores de datos</em>.
También podemos añadir una nueva dimensión a la visualización controlando el tamaño de cada uno de las burbujas. Para ello deberemos llevar un campo cuantitativo al campo <em>Tamaño</em> de la visualización. Por ejemplo, si llevamos nuestra medida <em>Units</em> (número de unidades vendidas) a este campo, obtenemos el siguiente resultado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_05.jpg"></a>
Podemos modificar el tamaño medio de las burbujas en <em>Formato > Formas > Tamaño</em> con el fin de que, por ejemplo, el solape no sea tan grande (véase siguiente imagen).
Por supuesto, al mover el cursor encima de una de las burbujas se muestra una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_06.jpg"></a>
La visualización ofrece un campo adicional, <em>Eje de reproducción</em>, que nos va a permitir mostrar el gráfico de dispersión para cada uno de los valores de la variable categórica que llevemos a este campo (frecuentemente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_07.jpg"></a>
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_08.jpg"></a>
Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_10.jpg"></a>
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
La visualización nos permite configurar los ejes X e Y, modificar la marca a usar para los puntos (círculos, cuadrados, triángulos o rombos), mostrar o no las etiquetas que representan cada punto, etc.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-175b1ca1-76f7-4c84-9813-df2a2eb50763') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización de Microsoft, <strong>Sunburst</strong>, nos permite visualizar una métrica asociada a datos jerárquicos, mostrándose esta información en círculos concéntricos que representan cada uno de los niveles de la jerarquía. La configuración de esta visualización es muy sencilla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_01.jpg"></a>
Al campo <em>Grupos</em> deberemos llevar los campos que conforman nuestra jerarquía (por ejemplo, los campos <em>Country</em>, <em>Region</em> y <em>City</em> que especifican dónde se realizan las ventas), y al campo <em>Valores</em> deberemos llevar la métrica (solo se admite una) que queremos analizar (por ejemplo, las ventas). El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_02.jpg"></a>
Comprobamos que la mayor parte de las etiquetas no se pueden ver (y la fuente ya tiene, por defecto, el mínimo tamaño posible). Curiosamente, si agrandamos la visualización, las etiquetas aumentan de tamaño también (aunque el tamaño de la fuente sigue apareciendo como siendo el menor posible), lo que no parece tener demasiado sentido...
Al mover el cursor por encima de una de las áreas se abre una ventana flotante con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_03.jpg"></a>
...sin embargo, la etiqueta en cuestión no se muestra con el formato que hayamos dado al campo o a la medida en Power BI. La visualización permite especificar el número de cifras decimales o las unidades (miles, millones, etc.) pero no es posible, por ejemplo, mostrar la cifra con separadores de miles.
Podemos modificar los colores que se asignan a los diferentes niveles de la estructura jerárquica (véase la siguiente imagen). Un clic en una de las áreas la selecciona (filtrando el informe) y muestra en el centro de la visualización el porcentaje que representa respecto del total. Tampoco esta etiqueta es configurable, mostrándose en un tamaño excesivamente pequeño:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_04.jpg"></a>
También es posible mostrar o no la leyenda y poco más, en realidad.
Lo cierto es que esta visualización tiene bastante margen de mejora, existiendo en el marketplace visualizaciones de este tipo mucho mejores.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-175b1ca1-76f7-4c84-9813-df2a2eb50763') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización de Microsoft, <strong>Sunburst</strong>, nos permite visualizar una métrica asociada a datos jerárquicos, mostrándose esta información en círculos concéntricos que representan cada uno de los niveles de la jerarquía. La configuración de esta visualización es muy sencilla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_01.jpg"></a>
Al campo <em>Grupos</em> deberemos llevar los campos que conforman nuestra jerarquía (por ejemplo, los campos <em>Country</em>, <em>Region</em> y <em>City</em> que especifican dónde se realizan las ventas), y al campo <em>Valores</em> deberemos llevar la métrica (solo se admite una) que queremos analizar (por ejemplo, las ventas). El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_02.jpg"></a>
Comprobamos que la mayor parte de las etiquetas no se pueden ver (y la fuente ya tiene, por defecto, el mínimo tamaño posible). Curiosamente, si agrandamos la visualización, las etiquetas aumentan de tamaño también (aunque el tamaño de la fuente sigue apareciendo como siendo el menor posible), lo que no parece tener demasiado sentido...
Al mover el cursor por encima de una de las áreas se abre una ventana flotante con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_03.jpg"></a>
...sin embargo, la etiqueta en cuestión no se muestra con el formato que hayamos dado al campo o a la medida en Power BI. La visualización permite especificar el número de cifras decimales o las unidades (miles, millones, etc.) pero no es posible, por ejemplo, mostrar la cifra con separadores de miles.
Podemos modificar los colores que se asignan a los diferentes niveles de la estructura jerárquica (véase la siguiente imagen). Un clic en una de las áreas la selecciona (filtrando el informe) y muestra en el centro de la visualización el porcentaje que representa respecto del total. Tampoco esta etiqueta es configurable, mostrándose en un tamaño excesivamente pequeño:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_04.jpg"></a>
También es posible mostrar o no la leyenda y poco más, en realidad.
Lo cierto es que esta visualización tiene bastante margen de mejora, existiendo en el marketplace visualizaciones de este tipo mucho mejores.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-175b1ca1-76f7-4c84-9813-df2a2eb50763') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización de Microsoft, <strong>Sunburst</strong>, nos permite visualizar una métrica asociada a datos jerárquicos, mostrándose esta información en círculos concéntricos que representan cada uno de los niveles de la jerarquía. La configuración de esta visualización es muy sencilla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_01.jpg"></a>
Al campo <em>Grupos</em> deberemos llevar los campos que conforman nuestra jerarquía (por ejemplo, los campos <em>Country</em>, <em>Region</em> y <em>City</em> que especifican dónde se realizan las ventas), y al campo <em>Valores</em> deberemos llevar la métrica (solo se admite una) que queremos analizar (por ejemplo, las ventas). El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_02.jpg"></a>
Comprobamos que la mayor parte de las etiquetas no se pueden ver (y la fuente ya tiene, por defecto, el mínimo tamaño posible). Curiosamente, si agrandamos la visualización, las etiquetas aumentan de tamaño también (aunque el tamaño de la fuente sigue apareciendo como siendo el menor posible), lo que no parece tener demasiado sentido...
Al mover el cursor por encima de una de las áreas se abre una ventana flotante con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_03.jpg"></a>
...sin embargo, la etiqueta en cuestión no se muestra con el formato que hayamos dado al campo o a la medida en Power BI. La visualización permite especificar el número de cifras decimales o las unidades (miles, millones, etc.) pero no es posible, por ejemplo, mostrar la cifra con separadores de miles.
Podemos modificar los colores que se asignan a los diferentes niveles de la estructura jerárquica (véase la siguiente imagen). Un clic en una de las áreas la selecciona (filtrando el informe) y muestra en el centro de la visualización el porcentaje que representa respecto del total. Tampoco esta etiqueta es configurable, mostrándose en un tamaño excesivamente pequeño:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_04.jpg"></a>
También es posible mostrar o no la leyenda y poco más, en realidad.
Lo cierto es que esta visualización tiene bastante margen de mejora, existiendo en el marketplace visualizaciones de este tipo mucho mejores.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-175b1ca1-76f7-4c84-9813-df2a2eb50763') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización de Microsoft, <strong>Sunburst</strong>, nos permite visualizar una métrica asociada a datos jerárquicos, mostrándose esta información en círculos concéntricos que representan cada uno de los niveles de la jerarquía. La configuración de esta visualización es muy sencilla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_01.jpg"></a>
Al campo <em>Grupos</em> deberemos llevar los campos que conforman nuestra jerarquía (por ejemplo, los campos <em>Country</em>, <em>Region</em> y <em>City</em> que especifican dónde se realizan las ventas), y al campo <em>Valores</em> deberemos llevar la métrica (solo se admite una) que queremos analizar (por ejemplo, las ventas). El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_02.jpg"></a>
Comprobamos que la mayor parte de las etiquetas no se pueden ver (y la fuente ya tiene, por defecto, el mínimo tamaño posible). Curiosamente, si agrandamos la visualización, las etiquetas aumentan de tamaño también (aunque el tamaño de la fuente sigue apareciendo como siendo el menor posible), lo que no parece tener demasiado sentido...
Al mover el cursor por encima de una de las áreas se abre una ventana flotante con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_03.jpg"></a>
...sin embargo, la etiqueta en cuestión no se muestra con el formato que hayamos dado al campo o a la medida en Power BI. La visualización permite especificar el número de cifras decimales o las unidades (miles, millones, etc.) pero no es posible, por ejemplo, mostrar la cifra con separadores de miles.
Podemos modificar los colores que se asignan a los diferentes niveles de la estructura jerárquica (véase la siguiente imagen). Un clic en una de las áreas la selecciona (filtrando el informe) y muestra en el centro de la visualización el porcentaje que representa respecto del total. Tampoco esta etiqueta es configurable, mostrándose en un tamaño excesivamente pequeño:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_04.jpg"></a>
También es posible mostrar o no la leyenda y poco más, en realidad.
Lo cierto es que esta visualización tiene bastante margen de mejora, existiendo en el marketplace visualizaciones de este tipo mucho mejores.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-4b1a903c-f076-4820-9b21-9b587c33133a') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización de Microsoft, <strong>Sunburst</strong>, nos permite visualizar una métrica asociada a datos jerárquicos, mostrándose esta información en círculos concéntricos que representan cada uno de los niveles de la jerarquía. La configuración de esta visualización es muy sencilla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_01.jpg"></a>
Al campo <em>Grupos</em> deberemos llevar los campos que conforman nuestra jerarquía (por ejemplo, los campos <em>Country</em>, <em>Region</em> y <em>City</em> que especifican dónde se realizan las ventas), y al campo <em>Valores</em> deberemos llevar la métrica (solo se admite una) que queremos analizar (por ejemplo, las ventas). El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_02.jpg"></a>
Comprobamos que la mayor parte de las etiquetas no se pueden ver (y la fuente ya tiene, por defecto, el mínimo tamaño posible). Curiosamente, si agrandamos la visualización, las etiquetas aumentan de tamaño también (aunque el tamaño de la fuente sigue apareciendo como siendo el menor posible), lo que no parece tener demasiado sentido...
Al mover el cursor por encima de una de las áreas se abre una ventana flotante con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_03.jpg"></a>
...sin embargo, la etiqueta en cuestión no se muestra con el formato que hayamos dado al campo o a la medida en Power BI. La visualización permite especificar el número de cifras decimales o las unidades (miles, millones, etc.) pero no es posible, por ejemplo, mostrar la cifra con separadores de miles.
Podemos modificar los colores que se asignan a los diferentes niveles de la estructura jerárquica (véase la siguiente imagen). Un clic en una de las áreas la selecciona (filtrando el informe) y muestra en el centro de la visualización el porcentaje que representa respecto del total. Tampoco esta etiqueta es configurable, mostrándose en un tamaño excesivamente pequeño:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_04.jpg"></a>
También es posible mostrar o no la leyenda y poco más, en realidad.
Lo cierto es que esta visualización tiene bastante margen de mejora, existiendo en el marketplace visualizaciones de este tipo mucho mejores.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-4b1a903c-f076-4820-9b21-9b587c33133a') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización de Microsoft, <strong>Sunburst</strong>, nos permite visualizar una métrica asociada a datos jerárquicos, mostrándose esta información en círculos concéntricos que representan cada uno de los niveles de la jerarquía. La configuración de esta visualización es muy sencilla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_01.jpg"></a>
Al campo <em>Grupos</em> deberemos llevar los campos que conforman nuestra jerarquía (por ejemplo, los campos <em>Country</em>, <em>Region</em> y <em>City</em> que especifican dónde se realizan las ventas), y al campo <em>Valores</em> deberemos llevar la métrica (solo se admite una) que queremos analizar (por ejemplo, las ventas). El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_02.jpg"></a>
Comprobamos que la mayor parte de las etiquetas no se pueden ver (y la fuente ya tiene, por defecto, el mínimo tamaño posible). Curiosamente, si agrandamos la visualización, las etiquetas aumentan de tamaño también (aunque el tamaño de la fuente sigue apareciendo como siendo el menor posible), lo que no parece tener demasiado sentido...
Al mover el cursor por encima de una de las áreas se abre una ventana flotante con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_03.jpg"></a>
...sin embargo, la etiqueta en cuestión no se muestra con el formato que hayamos dado al campo o a la medida en Power BI. La visualización permite especificar el número de cifras decimales o las unidades (miles, millones, etc.) pero no es posible, por ejemplo, mostrar la cifra con separadores de miles.
Podemos modificar los colores que se asignan a los diferentes niveles de la estructura jerárquica (véase la siguiente imagen). Un clic en una de las áreas la selecciona (filtrando el informe) y muestra en el centro de la visualización el porcentaje que representa respecto del total. Tampoco esta etiqueta es configurable, mostrándose en un tamaño excesivamente pequeño:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_04.jpg"></a>
También es posible mostrar o no la leyenda y poco más, en realidad.
Lo cierto es que esta visualización tiene bastante margen de mejora, existiendo en el marketplace visualizaciones de este tipo mucho mejores.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-4b1a903c-f076-4820-9b21-9b587c33133a') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización de Microsoft, <strong>Sunburst</strong>, nos permite visualizar una métrica asociada a datos jerárquicos, mostrándose esta información en círculos concéntricos que representan cada uno de los niveles de la jerarquía. La configuración de esta visualización es muy sencilla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_01.jpg"></a>
Al campo <em>Grupos</em> deberemos llevar los campos que conforman nuestra jerarquía (por ejemplo, los campos <em>Country</em>, <em>Region</em> y <em>City</em> que especifican dónde se realizan las ventas), y al campo <em>Valores</em> deberemos llevar la métrica (solo se admite una) que queremos analizar (por ejemplo, las ventas). El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_02.jpg"></a>
Comprobamos que la mayor parte de las etiquetas no se pueden ver (y la fuente ya tiene, por defecto, el mínimo tamaño posible). Curiosamente, si agrandamos la visualización, las etiquetas aumentan de tamaño también (aunque el tamaño de la fuente sigue apareciendo como siendo el menor posible), lo que no parece tener demasiado sentido...
Al mover el cursor por encima de una de las áreas se abre una ventana flotante con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_03.jpg"></a>
...sin embargo, la etiqueta en cuestión no se muestra con el formato que hayamos dado al campo o a la medida en Power BI. La visualización permite especificar el número de cifras decimales o las unidades (miles, millones, etc.) pero no es posible, por ejemplo, mostrar la cifra con separadores de miles.
Podemos modificar los colores que se asignan a los diferentes niveles de la estructura jerárquica (véase la siguiente imagen). Un clic en una de las áreas la selecciona (filtrando el informe) y muestra en el centro de la visualización el porcentaje que representa respecto del total. Tampoco esta etiqueta es configurable, mostrándose en un tamaño excesivamente pequeño:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_04.jpg"></a>
También es posible mostrar o no la leyenda y poco más, en realidad.
Lo cierto es que esta visualización tiene bastante margen de mejora, existiendo en el marketplace visualizaciones de este tipo mucho mejores.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-4b1a903c-f076-4820-9b21-9b587c33133a') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización de Microsoft, <strong>Sunburst</strong>, nos permite visualizar una métrica asociada a datos jerárquicos, mostrándose esta información en círculos concéntricos que representan cada uno de los niveles de la jerarquía. La configuración de esta visualización es muy sencilla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_01.jpg"></a>
Al campo <em>Grupos</em> deberemos llevar los campos que conforman nuestra jerarquía (por ejemplo, los campos <em>Country</em>, <em>Region</em> y <em>City</em> que especifican dónde se realizan las ventas), y al campo <em>Valores</em> deberemos llevar la métrica (solo se admite una) que queremos analizar (por ejemplo, las ventas). El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_02.jpg"></a>
Comprobamos que la mayor parte de las etiquetas no se pueden ver (y la fuente ya tiene, por defecto, el mínimo tamaño posible). Curiosamente, si agrandamos la visualización, las etiquetas aumentan de tamaño también (aunque el tamaño de la fuente sigue apareciendo como siendo el menor posible), lo que no parece tener demasiado sentido...
Al mover el cursor por encima de una de las áreas se abre una ventana flotante con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_03.jpg"></a>
...sin embargo, la etiqueta en cuestión no se muestra con el formato que hayamos dado al campo o a la medida en Power BI. La visualización permite especificar el número de cifras decimales o las unidades (miles, millones, etc.) pero no es posible, por ejemplo, mostrar la cifra con separadores de miles.
Podemos modificar los colores que se asignan a los diferentes niveles de la estructura jerárquica (véase la siguiente imagen). Un clic en una de las áreas la selecciona (filtrando el informe) y muestra en el centro de la visualización el porcentaje que representa respecto del total. Tampoco esta etiqueta es configurable, mostrándose en un tamaño excesivamente pequeño:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_04.jpg"></a>
También es posible mostrar o no la leyenda y poco más, en realidad.
Lo cierto es que esta visualización tiene bastante margen de mejora, existiendo en el marketplace visualizaciones de este tipo mucho mejores.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-266196d7-0ac5-44bc-9a31-6dfda3c37dba') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización de Microsoft, <strong>Sunburst</strong>, nos permite visualizar una métrica asociada a datos jerárquicos, mostrándose esta información en círculos concéntricos que representan cada uno de los niveles de la jerarquía. La configuración de esta visualización es muy sencilla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_01.jpg"></a>
Al campo <em>Grupos</em> deberemos llevar los campos que conforman nuestra jerarquía (por ejemplo, los campos <em>Country</em>, <em>Region</em> y <em>City</em> que especifican dónde se realizan las ventas), y al campo <em>Valores</em> deberemos llevar la métrica (solo se admite una) que queremos analizar (por ejemplo, las ventas). El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_02.jpg"></a>
Comprobamos que la mayor parte de las etiquetas no se pueden ver (y la fuente ya tiene, por defecto, el mínimo tamaño posible). Curiosamente, si agrandamos la visualización, las etiquetas aumentan de tamaño también (aunque el tamaño de la fuente sigue apareciendo como siendo el menor posible), lo que no parece tener demasiado sentido...
Al mover el cursor por encima de una de las áreas se abre una ventana flotante con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_03.jpg"></a>
...sin embargo, la etiqueta en cuestión no se muestra con el formato que hayamos dado al campo o a la medida en Power BI. La visualización permite especificar el número de cifras decimales o las unidades (miles, millones, etc.) pero no es posible, por ejemplo, mostrar la cifra con separadores de miles.
Podemos modificar los colores que se asignan a los diferentes niveles de la estructura jerárquica (véase la siguiente imagen). Un clic en una de las áreas la selecciona (filtrando el informe) y muestra en el centro de la visualización el porcentaje que representa respecto del total. Tampoco esta etiqueta es configurable, mostrándose en un tamaño excesivamente pequeño:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_04.jpg"></a>
También es posible mostrar o no la leyenda y poco más, en realidad.
Lo cierto es que esta visualización tiene bastante margen de mejora, existiendo en el marketplace visualizaciones de este tipo mucho mejores.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-266196d7-0ac5-44bc-9a31-6dfda3c37dba') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización de Microsoft, <strong>Sunburst</strong>, nos permite visualizar una métrica asociada a datos jerárquicos, mostrándose esta información en círculos concéntricos que representan cada uno de los niveles de la jerarquía. La configuración de esta visualización es muy sencilla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_01.jpg"></a>
Al campo <em>Grupos</em> deberemos llevar los campos que conforman nuestra jerarquía (por ejemplo, los campos <em>Country</em>, <em>Region</em> y <em>City</em> que especifican dónde se realizan las ventas), y al campo <em>Valores</em> deberemos llevar la métrica (solo se admite una) que queremos analizar (por ejemplo, las ventas). El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_02.jpg"></a>
Comprobamos que la mayor parte de las etiquetas no se pueden ver (y la fuente ya tiene, por defecto, el mínimo tamaño posible). Curiosamente, si agrandamos la visualización, las etiquetas aumentan de tamaño también (aunque el tamaño de la fuente sigue apareciendo como siendo el menor posible), lo que no parece tener demasiado sentido...
Al mover el cursor por encima de una de las áreas se abre una ventana flotante con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_03.jpg"></a>
...sin embargo, la etiqueta en cuestión no se muestra con el formato que hayamos dado al campo o a la medida en Power BI. La visualización permite especificar el número de cifras decimales o las unidades (miles, millones, etc.) pero no es posible, por ejemplo, mostrar la cifra con separadores de miles.
Podemos modificar los colores que se asignan a los diferentes niveles de la estructura jerárquica (véase la siguiente imagen). Un clic en una de las áreas la selecciona (filtrando el informe) y muestra en el centro de la visualización el porcentaje que representa respecto del total. Tampoco esta etiqueta es configurable, mostrándose en un tamaño excesivamente pequeño:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_04.jpg"></a>
También es posible mostrar o no la leyenda y poco más, en realidad.
Lo cierto es que esta visualización tiene bastante margen de mejora, existiendo en el marketplace visualizaciones de este tipo mucho mejores.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-266196d7-0ac5-44bc-9a31-6dfda3c37dba') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización de Microsoft, <strong>Sunburst</strong>, nos permite visualizar una métrica asociada a datos jerárquicos, mostrándose esta información en círculos concéntricos que representan cada uno de los niveles de la jerarquía. La configuración de esta visualización es muy sencilla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_01.jpg"></a>
Al campo <em>Grupos</em> deberemos llevar los campos que conforman nuestra jerarquía (por ejemplo, los campos <em>Country</em>, <em>Region</em> y <em>City</em> que especifican dónde se realizan las ventas), y al campo <em>Valores</em> deberemos llevar la métrica (solo se admite una) que queremos analizar (por ejemplo, las ventas). El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_02.jpg"></a>
Comprobamos que la mayor parte de las etiquetas no se pueden ver (y la fuente ya tiene, por defecto, el mínimo tamaño posible). Curiosamente, si agrandamos la visualización, las etiquetas aumentan de tamaño también (aunque el tamaño de la fuente sigue apareciendo como siendo el menor posible), lo que no parece tener demasiado sentido...
Al mover el cursor por encima de una de las áreas se abre una ventana flotante con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_03.jpg"></a>
...sin embargo, la etiqueta en cuestión no se muestra con el formato que hayamos dado al campo o a la medida en Power BI. La visualización permite especificar el número de cifras decimales o las unidades (miles, millones, etc.) pero no es posible, por ejemplo, mostrar la cifra con separadores de miles.
Podemos modificar los colores que se asignan a los diferentes niveles de la estructura jerárquica (véase la siguiente imagen). Un clic en una de las áreas la selecciona (filtrando el informe) y muestra en el centro de la visualización el porcentaje que representa respecto del total. Tampoco esta etiqueta es configurable, mostrándose en un tamaño excesivamente pequeño:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_04.jpg"></a>
También es posible mostrar o no la leyenda y poco más, en realidad.
Lo cierto es que esta visualización tiene bastante margen de mejora, existiendo en el marketplace visualizaciones de este tipo mucho mejores.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-266196d7-0ac5-44bc-9a31-6dfda3c37dba') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización de Microsoft, <strong>Sunburst</strong>, nos permite visualizar una métrica asociada a datos jerárquicos, mostrándose esta información en círculos concéntricos que representan cada uno de los niveles de la jerarquía. La configuración de esta visualización es muy sencilla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_01.jpg"></a>
Al campo <em>Grupos</em> deberemos llevar los campos que conforman nuestra jerarquía (por ejemplo, los campos <em>Country</em>, <em>Region</em> y <em>City</em> que especifican dónde se realizan las ventas), y al campo <em>Valores</em> deberemos llevar la métrica (solo se admite una) que queremos analizar (por ejemplo, las ventas). El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_02.jpg"></a>
Comprobamos que la mayor parte de las etiquetas no se pueden ver (y la fuente ya tiene, por defecto, el mínimo tamaño posible). Curiosamente, si agrandamos la visualización, las etiquetas aumentan de tamaño también (aunque el tamaño de la fuente sigue apareciendo como siendo el menor posible), lo que no parece tener demasiado sentido...
Al mover el cursor por encima de una de las áreas se abre una ventana flotante con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_03.jpg"></a>
...sin embargo, la etiqueta en cuestión no se muestra con el formato que hayamos dado al campo o a la medida en Power BI. La visualización permite especificar el número de cifras decimales o las unidades (miles, millones, etc.) pero no es posible, por ejemplo, mostrar la cifra con separadores de miles.
Podemos modificar los colores que se asignan a los diferentes niveles de la estructura jerárquica (véase la siguiente imagen). Un clic en una de las áreas la selecciona (filtrando el informe) y muestra en el centro de la visualización el porcentaje que representa respecto del total. Tampoco esta etiqueta es configurable, mostrándose en un tamaño excesivamente pequeño:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_04.jpg"></a>
También es posible mostrar o no la leyenda y poco más, en realidad.
Lo cierto es que esta visualización tiene bastante margen de mejora, existiendo en el marketplace visualizaciones de este tipo mucho mejores.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-f3c64f65-79c0-47cf-9457-757333e6c800') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización de Microsoft, <strong>Sunburst</strong>, nos permite visualizar una métrica asociada a datos jerárquicos, mostrándose esta información en círculos concéntricos que representan cada uno de los niveles de la jerarquía. La configuración de esta visualización es muy sencilla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_01.jpg"></a>
Al campo <em>Grupos</em> deberemos llevar los campos que conforman nuestra jerarquía (por ejemplo, los campos <em>Country</em>, <em>Region</em> y <em>City</em> que especifican dónde se realizan las ventas), y al campo <em>Valores</em> deberemos llevar la métrica (solo se admite una) que queremos analizar (por ejemplo, las ventas). El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_02.jpg"></a>
Comprobamos que la mayor parte de las etiquetas no se pueden ver (y la fuente ya tiene, por defecto, el mínimo tamaño posible). Curiosamente, si agrandamos la visualización, las etiquetas aumentan de tamaño también (aunque el tamaño de la fuente sigue apareciendo como siendo el menor posible), lo que no parece tener demasiado sentido...
Al mover el cursor por encima de una de las áreas se abre una ventana flotante con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_03.jpg"></a>
...sin embargo, la etiqueta en cuestión no se muestra con el formato que hayamos dado al campo o a la medida en Power BI. La visualización permite especificar el número de cifras decimales o las unidades (miles, millones, etc.) pero no es posible, por ejemplo, mostrar la cifra con separadores de miles.
Podemos modificar los colores que se asignan a los diferentes niveles de la estructura jerárquica (véase la siguiente imagen). Un clic en una de las áreas la selecciona (filtrando el informe) y muestra en el centro de la visualización el porcentaje que representa respecto del total. Tampoco esta etiqueta es configurable, mostrándose en un tamaño excesivamente pequeño:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_04.jpg"></a>
También es posible mostrar o no la leyenda y poco más, en realidad.
Lo cierto es que esta visualización tiene bastante margen de mejora, existiendo en el marketplace visualizaciones de este tipo mucho mejores.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-f3c64f65-79c0-47cf-9457-757333e6c800') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización de Microsoft, <strong>Sunburst</strong>, nos permite visualizar una métrica asociada a datos jerárquicos, mostrándose esta información en círculos concéntricos que representan cada uno de los niveles de la jerarquía. La configuración de esta visualización es muy sencilla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_01.jpg"></a>
Al campo <em>Grupos</em> deberemos llevar los campos que conforman nuestra jerarquía (por ejemplo, los campos <em>Country</em>, <em>Region</em> y <em>City</em> que especifican dónde se realizan las ventas), y al campo <em>Valores</em> deberemos llevar la métrica (solo se admite una) que queremos analizar (por ejemplo, las ventas). El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_02.jpg"></a>
Comprobamos que la mayor parte de las etiquetas no se pueden ver (y la fuente ya tiene, por defecto, el mínimo tamaño posible). Curiosamente, si agrandamos la visualización, las etiquetas aumentan de tamaño también (aunque el tamaño de la fuente sigue apareciendo como siendo el menor posible), lo que no parece tener demasiado sentido...
Al mover el cursor por encima de una de las áreas se abre una ventana flotante con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_03.jpg"></a>
...sin embargo, la etiqueta en cuestión no se muestra con el formato que hayamos dado al campo o a la medida en Power BI. La visualización permite especificar el número de cifras decimales o las unidades (miles, millones, etc.) pero no es posible, por ejemplo, mostrar la cifra con separadores de miles.
Podemos modificar los colores que se asignan a los diferentes niveles de la estructura jerárquica (véase la siguiente imagen). Un clic en una de las áreas la selecciona (filtrando el informe) y muestra en el centro de la visualización el porcentaje que representa respecto del total. Tampoco esta etiqueta es configurable, mostrándose en un tamaño excesivamente pequeño:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_04.jpg"></a>
También es posible mostrar o no la leyenda y poco más, en realidad.
Lo cierto es que esta visualización tiene bastante margen de mejora, existiendo en el marketplace visualizaciones de este tipo mucho mejores.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-f3c64f65-79c0-47cf-9457-757333e6c800') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización de Microsoft, <strong>Sunburst</strong>, nos permite visualizar una métrica asociada a datos jerárquicos, mostrándose esta información en círculos concéntricos que representan cada uno de los niveles de la jerarquía. La configuración de esta visualización es muy sencilla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_01.jpg"></a>
Al campo <em>Grupos</em> deberemos llevar los campos que conforman nuestra jerarquía (por ejemplo, los campos <em>Country</em>, <em>Region</em> y <em>City</em> que especifican dónde se realizan las ventas), y al campo <em>Valores</em> deberemos llevar la métrica (solo se admite una) que queremos analizar (por ejemplo, las ventas). El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_02.jpg"></a>
Comprobamos que la mayor parte de las etiquetas no se pueden ver (y la fuente ya tiene, por defecto, el mínimo tamaño posible). Curiosamente, si agrandamos la visualización, las etiquetas aumentan de tamaño también (aunque el tamaño de la fuente sigue apareciendo como siendo el menor posible), lo que no parece tener demasiado sentido...
Al mover el cursor por encima de una de las áreas se abre una ventana flotante con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_03.jpg"></a>
...sin embargo, la etiqueta en cuestión no se muestra con el formato que hayamos dado al campo o a la medida en Power BI. La visualización permite especificar el número de cifras decimales o las unidades (miles, millones, etc.) pero no es posible, por ejemplo, mostrar la cifra con separadores de miles.
Podemos modificar los colores que se asignan a los diferentes niveles de la estructura jerárquica (véase la siguiente imagen). Un clic en una de las áreas la selecciona (filtrando el informe) y muestra en el centro de la visualización el porcentaje que representa respecto del total. Tampoco esta etiqueta es configurable, mostrándose en un tamaño excesivamente pequeño:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_04.jpg"></a>
También es posible mostrar o no la leyenda y poco más, en realidad.
Lo cierto es que esta visualización tiene bastante margen de mejora, existiendo en el marketplace visualizaciones de este tipo mucho mejores.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-f3c64f65-79c0-47cf-9457-757333e6c800') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización de Microsoft, <strong>Sunburst</strong>, nos permite visualizar una métrica asociada a datos jerárquicos, mostrándose esta información en círculos concéntricos que representan cada uno de los niveles de la jerarquía. La configuración de esta visualización es muy sencilla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_01.jpg"></a>
Al campo <em>Grupos</em> deberemos llevar los campos que conforman nuestra jerarquía (por ejemplo, los campos <em>Country</em>, <em>Region</em> y <em>City</em> que especifican dónde se realizan las ventas), y al campo <em>Valores</em> deberemos llevar la métrica (solo se admite una) que queremos analizar (por ejemplo, las ventas). El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_02.jpg"></a>
Comprobamos que la mayor parte de las etiquetas no se pueden ver (y la fuente ya tiene, por defecto, el mínimo tamaño posible). Curiosamente, si agrandamos la visualización, las etiquetas aumentan de tamaño también (aunque el tamaño de la fuente sigue apareciendo como siendo el menor posible), lo que no parece tener demasiado sentido...
Al mover el cursor por encima de una de las áreas se abre una ventana flotante con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_03.jpg"></a>
...sin embargo, la etiqueta en cuestión no se muestra con el formato que hayamos dado al campo o a la medida en Power BI. La visualización permite especificar el número de cifras decimales o las unidades (miles, millones, etc.) pero no es posible, por ejemplo, mostrar la cifra con separadores de miles.
Podemos modificar los colores que se asignan a los diferentes niveles de la estructura jerárquica (véase la siguiente imagen). Un clic en una de las áreas la selecciona (filtrando el informe) y muestra en el centro de la visualización el porcentaje que representa respecto del total. Tampoco esta etiqueta es configurable, mostrándose en un tamaño excesivamente pequeño:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/sunburst_04.jpg"></a>
También es posible mostrar o no la leyenda y poco más, en realidad.
Lo cierto es que esta visualización tiene bastante margen de mejora, existiendo en el marketplace visualizaciones de este tipo mucho mejores.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-e4438e6f-e653-412a-83b7-d7389f487abb') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización permite mostrar una red de elementos relacionados, ofreciendo una buena cantidad de herramientas para configurar los enlaces que la forman. El panel de configuración es el siguiente:
<a href="/sites/default/files/2019-08/force_directed_graph_01.jpg"></a>
Los únicos campos obligatorios son los dos primeros: <em>Origen</em> y <em>Destino</em>. Nuestros empleados (identificados por un código) están organizados en red, estructura que se define en una tabla, <em>Network</em>, que contiene el campo <em>From</em> (representando el supervisor) y el campo <em>To</em> (representando el subordinado). Llevemos estos dos campos a los campos mencionados de la visualización):
<a href="/sites/default/files/2019-08/force_directed_graph_02.jpg"></a>
Se muestra la estructura en red de los trabajadores. Por defecto, el tamaño de cada nodo es proporcional al número de enlaces que llegan o salen de él. Si movemos el cursor encima de uno de los nodos, se muestran en rojo sus enlaces:
<a href="/sites/default/files/2019-08/force_directed_graph_03.jpg"></a>
Es necesario comentar que la red se crea con una interesante animación que nos permite pinchar y arrastrar un nodo, arrastrando consigo el resto de la red. Es posible mostrar la dirección del enlace en <em>Formato > Vínculos > Flecha</em> (véase siguiente imagen). También podemos llevar al campo <em>Peso</em> de la visualización un campo de nuestro modelo de datos que determine el "peso" de cada enlace (sea cual sea la interpretación que esto tenga en el mundo real). En la siguiente imagen se ha llevado un campo <em>Weight</em> conteniendo esta información al campo <em>Peso</em> de la visualización y se ha movido el ratón encima del nodo 29 para apreciar mejor el peso de sus enlaces:
<a href="/sites/default/files/2019-08/force_directed_graph_04.jpg"></a>
Sustituyamos los identificadores de los empleados por sus nombres...
Otro campo que ofrece la visualización es el de <em>Tipo de vínculo</em>. Agregar este campo a la visualización no la modifica desde un punto de vista gráfico, pero nos permite filtrar externamente los enlaces que nos interesan. Por ejemplo, en la siguiente imagen se ha llevado un campo <em>Type</em> (con el tipo de enlace) al campo mencionado de la visualización. Este campo divide los enlaces en tres tipos: A, B y C. Y una segmentación externa nos permite mostrar solo los enlaces de tipo A, por ejemplo:
<a href="/sites/default/files/2019-08/force_directed_graph_05.jpg"></a>
Otros dos campos adicionales, <em>Tipo de origen</em> y <em>Tipo de destino</em> nos permitirían clasificar los nodos de origen y destino de los enlaces, permitiendo filtrar la red según estos dos nuevos criterios.
La visualización no ofrece demasiadas opciones de personalización. Podemos modificar los colores de los enlaces (en función de su peso o tipo de vínculo), cambiar los círculos por una imagen externa accesible vía URL y poco más... No es posible, por ejemplo, modificar el color de los nodos, ni el color por defecto de los enlaces, ni añadir una imagen a éstos (por ejemplo, la fotografía del empleado). Se agradecería poder dar colores a los nodos en función de su tipo, número de enlaces que entran o salen, etc.
Es de destacar también que un clic en un nodo no filtra el resto de visualizaciones del informe, lo que limita también su funcionalidad.
En todo caso, se trata de una buena visualización, y bastante versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-e4438e6f-e653-412a-83b7-d7389f487abb') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización permite mostrar una red de elementos relacionados, ofreciendo una buena cantidad de herramientas para configurar los enlaces que la forman. El panel de configuración es el siguiente:
<a href="/sites/default/files/2019-08/force_directed_graph_01.jpg"></a>
Los únicos campos obligatorios son los dos primeros: <em>Origen</em> y <em>Destino</em>. Nuestros empleados (identificados por un código) están organizados en red, estructura que se define en una tabla, <em>Network</em>, que contiene el campo <em>From</em> (representando el supervisor) y el campo <em>To</em> (representando el subordinado). Llevemos estos dos campos a los campos mencionados de la visualización):
<a href="/sites/default/files/2019-08/force_directed_graph_02.jpg"></a>
Se muestra la estructura en red de los trabajadores. Por defecto, el tamaño de cada nodo es proporcional al número de enlaces que llegan o salen de él. Si movemos el cursor encima de uno de los nodos, se muestran en rojo sus enlaces:
<a href="/sites/default/files/2019-08/force_directed_graph_03.jpg"></a>
Es necesario comentar que la red se crea con una interesante animación que nos permite pinchar y arrastrar un nodo, arrastrando consigo el resto de la red. Es posible mostrar la dirección del enlace en <em>Formato > Vínculos > Flecha</em> (véase siguiente imagen). También podemos llevar al campo <em>Peso</em> de la visualización un campo de nuestro modelo de datos que determine el "peso" de cada enlace (sea cual sea la interpretación que esto tenga en el mundo real). En la siguiente imagen se ha llevado un campo <em>Weight</em> conteniendo esta información al campo <em>Peso</em> de la visualización y se ha movido el ratón encima del nodo 29 para apreciar mejor el peso de sus enlaces:
<a href="/sites/default/files/2019-08/force_directed_graph_04.jpg"></a>
Sustituyamos los identificadores de los empleados por sus nombres...
Otro campo que ofrece la visualización es el de <em>Tipo de vínculo</em>. Agregar este campo a la visualización no la modifica desde un punto de vista gráfico, pero nos permite filtrar externamente los enlaces que nos interesan. Por ejemplo, en la siguiente imagen se ha llevado un campo <em>Type</em> (con el tipo de enlace) al campo mencionado de la visualización. Este campo divide los enlaces en tres tipos: A, B y C. Y una segmentación externa nos permite mostrar solo los enlaces de tipo A, por ejemplo:
<a href="/sites/default/files/2019-08/force_directed_graph_05.jpg"></a>
Otros dos campos adicionales, <em>Tipo de origen</em> y <em>Tipo de destino</em> nos permitirían clasificar los nodos de origen y destino de los enlaces, permitiendo filtrar la red según estos dos nuevos criterios.
La visualización no ofrece demasiadas opciones de personalización. Podemos modificar los colores de los enlaces (en función de su peso o tipo de vínculo), cambiar los círculos por una imagen externa accesible vía URL y poco más... No es posible, por ejemplo, modificar el color de los nodos, ni el color por defecto de los enlaces, ni añadir una imagen a éstos (por ejemplo, la fotografía del empleado). Se agradecería poder dar colores a los nodos en función de su tipo, número de enlaces que entran o salen, etc.
Es de destacar también que un clic en un nodo no filtra el resto de visualizaciones del informe, lo que limita también su funcionalidad.
En todo caso, se trata de una buena visualización, y bastante versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-e4438e6f-e653-412a-83b7-d7389f487abb') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización permite mostrar una red de elementos relacionados, ofreciendo una buena cantidad de herramientas para configurar los enlaces que la forman. El panel de configuración es el siguiente:
<a href="/sites/default/files/2019-08/force_directed_graph_01.jpg"></a>
Los únicos campos obligatorios son los dos primeros: <em>Origen</em> y <em>Destino</em>. Nuestros empleados (identificados por un código) están organizados en red, estructura que se define en una tabla, <em>Network</em>, que contiene el campo <em>From</em> (representando el supervisor) y el campo <em>To</em> (representando el subordinado). Llevemos estos dos campos a los campos mencionados de la visualización):
<a href="/sites/default/files/2019-08/force_directed_graph_02.jpg"></a>
Se muestra la estructura en red de los trabajadores. Por defecto, el tamaño de cada nodo es proporcional al número de enlaces que llegan o salen de él. Si movemos el cursor encima de uno de los nodos, se muestran en rojo sus enlaces:
<a href="/sites/default/files/2019-08/force_directed_graph_03.jpg"></a>
Es necesario comentar que la red se crea con una interesante animación que nos permite pinchar y arrastrar un nodo, arrastrando consigo el resto de la red. Es posible mostrar la dirección del enlace en <em>Formato > Vínculos > Flecha</em> (véase siguiente imagen). También podemos llevar al campo <em>Peso</em> de la visualización un campo de nuestro modelo de datos que determine el "peso" de cada enlace (sea cual sea la interpretación que esto tenga en el mundo real). En la siguiente imagen se ha llevado un campo <em>Weight</em> conteniendo esta información al campo <em>Peso</em> de la visualización y se ha movido el ratón encima del nodo 29 para apreciar mejor el peso de sus enlaces:
<a href="/sites/default/files/2019-08/force_directed_graph_04.jpg"></a>
Sustituyamos los identificadores de los empleados por sus nombres...
Otro campo que ofrece la visualización es el de <em>Tipo de vínculo</em>. Agregar este campo a la visualización no la modifica desde un punto de vista gráfico, pero nos permite filtrar externamente los enlaces que nos interesan. Por ejemplo, en la siguiente imagen se ha llevado un campo <em>Type</em> (con el tipo de enlace) al campo mencionado de la visualización. Este campo divide los enlaces en tres tipos: A, B y C. Y una segmentación externa nos permite mostrar solo los enlaces de tipo A, por ejemplo:
<a href="/sites/default/files/2019-08/force_directed_graph_05.jpg"></a>
Otros dos campos adicionales, <em>Tipo de origen</em> y <em>Tipo de destino</em> nos permitirían clasificar los nodos de origen y destino de los enlaces, permitiendo filtrar la red según estos dos nuevos criterios.
La visualización no ofrece demasiadas opciones de personalización. Podemos modificar los colores de los enlaces (en función de su peso o tipo de vínculo), cambiar los círculos por una imagen externa accesible vía URL y poco más... No es posible, por ejemplo, modificar el color de los nodos, ni el color por defecto de los enlaces, ni añadir una imagen a éstos (por ejemplo, la fotografía del empleado). Se agradecería poder dar colores a los nodos en función de su tipo, número de enlaces que entran o salen, etc.
Es de destacar también que un clic en un nodo no filtra el resto de visualizaciones del informe, lo que limita también su funcionalidad.
En todo caso, se trata de una buena visualización, y bastante versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-e4438e6f-e653-412a-83b7-d7389f487abb') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización permite mostrar una red de elementos relacionados, ofreciendo una buena cantidad de herramientas para configurar los enlaces que la forman. El panel de configuración es el siguiente:
<a href="/sites/default/files/2019-08/force_directed_graph_01.jpg"></a>
Los únicos campos obligatorios son los dos primeros: <em>Origen</em> y <em>Destino</em>. Nuestros empleados (identificados por un código) están organizados en red, estructura que se define en una tabla, <em>Network</em>, que contiene el campo <em>From</em> (representando el supervisor) y el campo <em>To</em> (representando el subordinado). Llevemos estos dos campos a los campos mencionados de la visualización):
<a href="/sites/default/files/2019-08/force_directed_graph_02.jpg"></a>
Se muestra la estructura en red de los trabajadores. Por defecto, el tamaño de cada nodo es proporcional al número de enlaces que llegan o salen de él. Si movemos el cursor encima de uno de los nodos, se muestran en rojo sus enlaces:
<a href="/sites/default/files/2019-08/force_directed_graph_03.jpg"></a>
Es necesario comentar que la red se crea con una interesante animación que nos permite pinchar y arrastrar un nodo, arrastrando consigo el resto de la red. Es posible mostrar la dirección del enlace en <em>Formato > Vínculos > Flecha</em> (véase siguiente imagen). También podemos llevar al campo <em>Peso</em> de la visualización un campo de nuestro modelo de datos que determine el "peso" de cada enlace (sea cual sea la interpretación que esto tenga en el mundo real). En la siguiente imagen se ha llevado un campo <em>Weight</em> conteniendo esta información al campo <em>Peso</em> de la visualización y se ha movido el ratón encima del nodo 29 para apreciar mejor el peso de sus enlaces:
<a href="/sites/default/files/2019-08/force_directed_graph_04.jpg"></a>
Sustituyamos los identificadores de los empleados por sus nombres...
Otro campo que ofrece la visualización es el de <em>Tipo de vínculo</em>. Agregar este campo a la visualización no la modifica desde un punto de vista gráfico, pero nos permite filtrar externamente los enlaces que nos interesan. Por ejemplo, en la siguiente imagen se ha llevado un campo <em>Type</em> (con el tipo de enlace) al campo mencionado de la visualización. Este campo divide los enlaces en tres tipos: A, B y C. Y una segmentación externa nos permite mostrar solo los enlaces de tipo A, por ejemplo:
<a href="/sites/default/files/2019-08/force_directed_graph_05.jpg"></a>
Otros dos campos adicionales, <em>Tipo de origen</em> y <em>Tipo de destino</em> nos permitirían clasificar los nodos de origen y destino de los enlaces, permitiendo filtrar la red según estos dos nuevos criterios.
La visualización no ofrece demasiadas opciones de personalización. Podemos modificar los colores de los enlaces (en función de su peso o tipo de vínculo), cambiar los círculos por una imagen externa accesible vía URL y poco más... No es posible, por ejemplo, modificar el color de los nodos, ni el color por defecto de los enlaces, ni añadir una imagen a éstos (por ejemplo, la fotografía del empleado). Se agradecería poder dar colores a los nodos en función de su tipo, número de enlaces que entran o salen, etc.
Es de destacar también que un clic en un nodo no filtra el resto de visualizaciones del informe, lo que limita también su funcionalidad.
En todo caso, se trata de una buena visualización, y bastante versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-b10dd909-958f-4d38-aa62-529928c8e987') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización permite mostrar una red de elementos relacionados, ofreciendo una buena cantidad de herramientas para configurar los enlaces que la forman. El panel de configuración es el siguiente:
<a href="/sites/default/files/2019-08/force_directed_graph_01.jpg"></a>
Los únicos campos obligatorios son los dos primeros: <em>Origen</em> y <em>Destino</em>. Nuestros empleados (identificados por un código) están organizados en red, estructura que se define en una tabla, <em>Network</em>, que contiene el campo <em>From</em> (representando el supervisor) y el campo <em>To</em> (representando el subordinado). Llevemos estos dos campos a los campos mencionados de la visualización):
<a href="/sites/default/files/2019-08/force_directed_graph_02.jpg"></a>
Se muestra la estructura en red de los trabajadores. Por defecto, el tamaño de cada nodo es proporcional al número de enlaces que llegan o salen de él. Si movemos el cursor encima de uno de los nodos, se muestran en rojo sus enlaces:
<a href="/sites/default/files/2019-08/force_directed_graph_03.jpg"></a>
Es necesario comentar que la red se crea con una interesante animación que nos permite pinchar y arrastrar un nodo, arrastrando consigo el resto de la red. Es posible mostrar la dirección del enlace en <em>Formato > Vínculos > Flecha</em> (véase siguiente imagen). También podemos llevar al campo <em>Peso</em> de la visualización un campo de nuestro modelo de datos que determine el "peso" de cada enlace (sea cual sea la interpretación que esto tenga en el mundo real). En la siguiente imagen se ha llevado un campo <em>Weight</em> conteniendo esta información al campo <em>Peso</em> de la visualización y se ha movido el ratón encima del nodo 29 para apreciar mejor el peso de sus enlaces:
<a href="/sites/default/files/2019-08/force_directed_graph_04.jpg"></a>
Sustituyamos los identificadores de los empleados por sus nombres...
Otro campo que ofrece la visualización es el de <em>Tipo de vínculo</em>. Agregar este campo a la visualización no la modifica desde un punto de vista gráfico, pero nos permite filtrar externamente los enlaces que nos interesan. Por ejemplo, en la siguiente imagen se ha llevado un campo <em>Type</em> (con el tipo de enlace) al campo mencionado de la visualización. Este campo divide los enlaces en tres tipos: A, B y C. Y una segmentación externa nos permite mostrar solo los enlaces de tipo A, por ejemplo:
<a href="/sites/default/files/2019-08/force_directed_graph_05.jpg"></a>
Otros dos campos adicionales, <em>Tipo de origen</em> y <em>Tipo de destino</em> nos permitirían clasificar los nodos de origen y destino de los enlaces, permitiendo filtrar la red según estos dos nuevos criterios.
La visualización no ofrece demasiadas opciones de personalización. Podemos modificar los colores de los enlaces (en función de su peso o tipo de vínculo), cambiar los círculos por una imagen externa accesible vía URL y poco más... No es posible, por ejemplo, modificar el color de los nodos, ni el color por defecto de los enlaces, ni añadir una imagen a éstos (por ejemplo, la fotografía del empleado). Se agradecería poder dar colores a los nodos en función de su tipo, número de enlaces que entran o salen, etc.
Es de destacar también que un clic en un nodo no filtra el resto de visualizaciones del informe, lo que limita también su funcionalidad.
En todo caso, se trata de una buena visualización, y bastante versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-b10dd909-958f-4d38-aa62-529928c8e987') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización permite mostrar una red de elementos relacionados, ofreciendo una buena cantidad de herramientas para configurar los enlaces que la forman. El panel de configuración es el siguiente:
<a href="/sites/default/files/2019-08/force_directed_graph_01.jpg"></a>
Los únicos campos obligatorios son los dos primeros: <em>Origen</em> y <em>Destino</em>. Nuestros empleados (identificados por un código) están organizados en red, estructura que se define en una tabla, <em>Network</em>, que contiene el campo <em>From</em> (representando el supervisor) y el campo <em>To</em> (representando el subordinado). Llevemos estos dos campos a los campos mencionados de la visualización):
<a href="/sites/default/files/2019-08/force_directed_graph_02.jpg"></a>
Se muestra la estructura en red de los trabajadores. Por defecto, el tamaño de cada nodo es proporcional al número de enlaces que llegan o salen de él. Si movemos el cursor encima de uno de los nodos, se muestran en rojo sus enlaces:
<a href="/sites/default/files/2019-08/force_directed_graph_03.jpg"></a>
Es necesario comentar que la red se crea con una interesante animación que nos permite pinchar y arrastrar un nodo, arrastrando consigo el resto de la red. Es posible mostrar la dirección del enlace en <em>Formato > Vínculos > Flecha</em> (véase siguiente imagen). También podemos llevar al campo <em>Peso</em> de la visualización un campo de nuestro modelo de datos que determine el "peso" de cada enlace (sea cual sea la interpretación que esto tenga en el mundo real). En la siguiente imagen se ha llevado un campo <em>Weight</em> conteniendo esta información al campo <em>Peso</em> de la visualización y se ha movido el ratón encima del nodo 29 para apreciar mejor el peso de sus enlaces:
<a href="/sites/default/files/2019-08/force_directed_graph_04.jpg"></a>
Sustituyamos los identificadores de los empleados por sus nombres...
Otro campo que ofrece la visualización es el de <em>Tipo de vínculo</em>. Agregar este campo a la visualización no la modifica desde un punto de vista gráfico, pero nos permite filtrar externamente los enlaces que nos interesan. Por ejemplo, en la siguiente imagen se ha llevado un campo <em>Type</em> (con el tipo de enlace) al campo mencionado de la visualización. Este campo divide los enlaces en tres tipos: A, B y C. Y una segmentación externa nos permite mostrar solo los enlaces de tipo A, por ejemplo:
<a href="/sites/default/files/2019-08/force_directed_graph_05.jpg"></a>
Otros dos campos adicionales, <em>Tipo de origen</em> y <em>Tipo de destino</em> nos permitirían clasificar los nodos de origen y destino de los enlaces, permitiendo filtrar la red según estos dos nuevos criterios.
La visualización no ofrece demasiadas opciones de personalización. Podemos modificar los colores de los enlaces (en función de su peso o tipo de vínculo), cambiar los círculos por una imagen externa accesible vía URL y poco más... No es posible, por ejemplo, modificar el color de los nodos, ni el color por defecto de los enlaces, ni añadir una imagen a éstos (por ejemplo, la fotografía del empleado). Se agradecería poder dar colores a los nodos en función de su tipo, número de enlaces que entran o salen, etc.
Es de destacar también que un clic en un nodo no filtra el resto de visualizaciones del informe, lo que limita también su funcionalidad.
En todo caso, se trata de una buena visualización, y bastante versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-b10dd909-958f-4d38-aa62-529928c8e987') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización permite mostrar una red de elementos relacionados, ofreciendo una buena cantidad de herramientas para configurar los enlaces que la forman. El panel de configuración es el siguiente:
<a href="/sites/default/files/2019-08/force_directed_graph_01.jpg"></a>
Los únicos campos obligatorios son los dos primeros: <em>Origen</em> y <em>Destino</em>. Nuestros empleados (identificados por un código) están organizados en red, estructura que se define en una tabla, <em>Network</em>, que contiene el campo <em>From</em> (representando el supervisor) y el campo <em>To</em> (representando el subordinado). Llevemos estos dos campos a los campos mencionados de la visualización):
<a href="/sites/default/files/2019-08/force_directed_graph_02.jpg"></a>
Se muestra la estructura en red de los trabajadores. Por defecto, el tamaño de cada nodo es proporcional al número de enlaces que llegan o salen de él. Si movemos el cursor encima de uno de los nodos, se muestran en rojo sus enlaces:
<a href="/sites/default/files/2019-08/force_directed_graph_03.jpg"></a>
Es necesario comentar que la red se crea con una interesante animación que nos permite pinchar y arrastrar un nodo, arrastrando consigo el resto de la red. Es posible mostrar la dirección del enlace en <em>Formato > Vínculos > Flecha</em> (véase siguiente imagen). También podemos llevar al campo <em>Peso</em> de la visualización un campo de nuestro modelo de datos que determine el "peso" de cada enlace (sea cual sea la interpretación que esto tenga en el mundo real). En la siguiente imagen se ha llevado un campo <em>Weight</em> conteniendo esta información al campo <em>Peso</em> de la visualización y se ha movido el ratón encima del nodo 29 para apreciar mejor el peso de sus enlaces:
<a href="/sites/default/files/2019-08/force_directed_graph_04.jpg"></a>
Sustituyamos los identificadores de los empleados por sus nombres...
Otro campo que ofrece la visualización es el de <em>Tipo de vínculo</em>. Agregar este campo a la visualización no la modifica desde un punto de vista gráfico, pero nos permite filtrar externamente los enlaces que nos interesan. Por ejemplo, en la siguiente imagen se ha llevado un campo <em>Type</em> (con el tipo de enlace) al campo mencionado de la visualización. Este campo divide los enlaces en tres tipos: A, B y C. Y una segmentación externa nos permite mostrar solo los enlaces de tipo A, por ejemplo:
<a href="/sites/default/files/2019-08/force_directed_graph_05.jpg"></a>
Otros dos campos adicionales, <em>Tipo de origen</em> y <em>Tipo de destino</em> nos permitirían clasificar los nodos de origen y destino de los enlaces, permitiendo filtrar la red según estos dos nuevos criterios.
La visualización no ofrece demasiadas opciones de personalización. Podemos modificar los colores de los enlaces (en función de su peso o tipo de vínculo), cambiar los círculos por una imagen externa accesible vía URL y poco más... No es posible, por ejemplo, modificar el color de los nodos, ni el color por defecto de los enlaces, ni añadir una imagen a éstos (por ejemplo, la fotografía del empleado). Se agradecería poder dar colores a los nodos en función de su tipo, número de enlaces que entran o salen, etc.
Es de destacar también que un clic en un nodo no filtra el resto de visualizaciones del informe, lo que limita también su funcionalidad.
En todo caso, se trata de una buena visualización, y bastante versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-b10dd909-958f-4d38-aa62-529928c8e987') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización permite mostrar una red de elementos relacionados, ofreciendo una buena cantidad de herramientas para configurar los enlaces que la forman. El panel de configuración es el siguiente:
<a href="/sites/default/files/2019-08/force_directed_graph_01.jpg"></a>
Los únicos campos obligatorios son los dos primeros: <em>Origen</em> y <em>Destino</em>. Nuestros empleados (identificados por un código) están organizados en red, estructura que se define en una tabla, <em>Network</em>, que contiene el campo <em>From</em> (representando el supervisor) y el campo <em>To</em> (representando el subordinado). Llevemos estos dos campos a los campos mencionados de la visualización):
<a href="/sites/default/files/2019-08/force_directed_graph_02.jpg"></a>
Se muestra la estructura en red de los trabajadores. Por defecto, el tamaño de cada nodo es proporcional al número de enlaces que llegan o salen de él. Si movemos el cursor encima de uno de los nodos, se muestran en rojo sus enlaces:
<a href="/sites/default/files/2019-08/force_directed_graph_03.jpg"></a>
Es necesario comentar que la red se crea con una interesante animación que nos permite pinchar y arrastrar un nodo, arrastrando consigo el resto de la red. Es posible mostrar la dirección del enlace en <em>Formato > Vínculos > Flecha</em> (véase siguiente imagen). También podemos llevar al campo <em>Peso</em> de la visualización un campo de nuestro modelo de datos que determine el "peso" de cada enlace (sea cual sea la interpretación que esto tenga en el mundo real). En la siguiente imagen se ha llevado un campo <em>Weight</em> conteniendo esta información al campo <em>Peso</em> de la visualización y se ha movido el ratón encima del nodo 29 para apreciar mejor el peso de sus enlaces:
<a href="/sites/default/files/2019-08/force_directed_graph_04.jpg"></a>
Sustituyamos los identificadores de los empleados por sus nombres...
Otro campo que ofrece la visualización es el de <em>Tipo de vínculo</em>. Agregar este campo a la visualización no la modifica desde un punto de vista gráfico, pero nos permite filtrar externamente los enlaces que nos interesan. Por ejemplo, en la siguiente imagen se ha llevado un campo <em>Type</em> (con el tipo de enlace) al campo mencionado de la visualización. Este campo divide los enlaces en tres tipos: A, B y C. Y una segmentación externa nos permite mostrar solo los enlaces de tipo A, por ejemplo:
<a href="/sites/default/files/2019-08/force_directed_graph_05.jpg"></a>
Otros dos campos adicionales, <em>Tipo de origen</em> y <em>Tipo de destino</em> nos permitirían clasificar los nodos de origen y destino de los enlaces, permitiendo filtrar la red según estos dos nuevos criterios.
La visualización no ofrece demasiadas opciones de personalización. Podemos modificar los colores de los enlaces (en función de su peso o tipo de vínculo), cambiar los círculos por una imagen externa accesible vía URL y poco más... No es posible, por ejemplo, modificar el color de los nodos, ni el color por defecto de los enlaces, ni añadir una imagen a éstos (por ejemplo, la fotografía del empleado). Se agradecería poder dar colores a los nodos en función de su tipo, número de enlaces que entran o salen, etc.
Es de destacar también que un clic en un nodo no filtra el resto de visualizaciones del informe, lo que limita también su funcionalidad.
En todo caso, se trata de una buena visualización, y bastante versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-a1d30cc6-26b6-4a1c-9aad-54a40a21c2da') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización permite mostrar una red de elementos relacionados, ofreciendo una buena cantidad de herramientas para configurar los enlaces que la forman. El panel de configuración es el siguiente:
<a href="/sites/default/files/2019-08/force_directed_graph_01.jpg"></a>
Los únicos campos obligatorios son los dos primeros: <em>Origen</em> y <em>Destino</em>. Nuestros empleados (identificados por un código) están organizados en red, estructura que se define en una tabla, <em>Network</em>, que contiene el campo <em>From</em> (representando el supervisor) y el campo <em>To</em> (representando el subordinado). Llevemos estos dos campos a los campos mencionados de la visualización):
<a href="/sites/default/files/2019-08/force_directed_graph_02.jpg"></a>
Se muestra la estructura en red de los trabajadores. Por defecto, el tamaño de cada nodo es proporcional al número de enlaces que llegan o salen de él. Si movemos el cursor encima de uno de los nodos, se muestran en rojo sus enlaces:
<a href="/sites/default/files/2019-08/force_directed_graph_03.jpg"></a>
Es necesario comentar que la red se crea con una interesante animación que nos permite pinchar y arrastrar un nodo, arrastrando consigo el resto de la red. Es posible mostrar la dirección del enlace en <em>Formato > Vínculos > Flecha</em> (véase siguiente imagen). También podemos llevar al campo <em>Peso</em> de la visualización un campo de nuestro modelo de datos que determine el "peso" de cada enlace (sea cual sea la interpretación que esto tenga en el mundo real). En la siguiente imagen se ha llevado un campo <em>Weight</em> conteniendo esta información al campo <em>Peso</em> de la visualización y se ha movido el ratón encima del nodo 29 para apreciar mejor el peso de sus enlaces:
<a href="/sites/default/files/2019-08/force_directed_graph_04.jpg"></a>
Sustituyamos los identificadores de los empleados por sus nombres...
Otro campo que ofrece la visualización es el de <em>Tipo de vínculo</em>. Agregar este campo a la visualización no la modifica desde un punto de vista gráfico, pero nos permite filtrar externamente los enlaces que nos interesan. Por ejemplo, en la siguiente imagen se ha llevado un campo <em>Type</em> (con el tipo de enlace) al campo mencionado de la visualización. Este campo divide los enlaces en tres tipos: A, B y C. Y una segmentación externa nos permite mostrar solo los enlaces de tipo A, por ejemplo:
<a href="/sites/default/files/2019-08/force_directed_graph_05.jpg"></a>
Otros dos campos adicionales, <em>Tipo de origen</em> y <em>Tipo de destino</em> nos permitirían clasificar los nodos de origen y destino de los enlaces, permitiendo filtrar la red según estos dos nuevos criterios.
La visualización no ofrece demasiadas opciones de personalización. Podemos modificar los colores de los enlaces (en función de su peso o tipo de vínculo), cambiar los círculos por una imagen externa accesible vía URL y poco más... No es posible, por ejemplo, modificar el color de los nodos, ni el color por defecto de los enlaces, ni añadir una imagen a éstos (por ejemplo, la fotografía del empleado). Se agradecería poder dar colores a los nodos en función de su tipo, número de enlaces que entran o salen, etc.
Es de destacar también que un clic en un nodo no filtra el resto de visualizaciones del informe, lo que limita también su funcionalidad.
En todo caso, se trata de una buena visualización, y bastante versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-a1d30cc6-26b6-4a1c-9aad-54a40a21c2da') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización permite mostrar una red de elementos relacionados, ofreciendo una buena cantidad de herramientas para configurar los enlaces que la forman. El panel de configuración es el siguiente:
<a href="/sites/default/files/2019-08/force_directed_graph_01.jpg"></a>
Los únicos campos obligatorios son los dos primeros: <em>Origen</em> y <em>Destino</em>. Nuestros empleados (identificados por un código) están organizados en red, estructura que se define en una tabla, <em>Network</em>, que contiene el campo <em>From</em> (representando el supervisor) y el campo <em>To</em> (representando el subordinado). Llevemos estos dos campos a los campos mencionados de la visualización):
<a href="/sites/default/files/2019-08/force_directed_graph_02.jpg"></a>
Se muestra la estructura en red de los trabajadores. Por defecto, el tamaño de cada nodo es proporcional al número de enlaces que llegan o salen de él. Si movemos el cursor encima de uno de los nodos, se muestran en rojo sus enlaces:
<a href="/sites/default/files/2019-08/force_directed_graph_03.jpg"></a>
Es necesario comentar que la red se crea con una interesante animación que nos permite pinchar y arrastrar un nodo, arrastrando consigo el resto de la red. Es posible mostrar la dirección del enlace en <em>Formato > Vínculos > Flecha</em> (véase siguiente imagen). También podemos llevar al campo <em>Peso</em> de la visualización un campo de nuestro modelo de datos que determine el "peso" de cada enlace (sea cual sea la interpretación que esto tenga en el mundo real). En la siguiente imagen se ha llevado un campo <em>Weight</em> conteniendo esta información al campo <em>Peso</em> de la visualización y se ha movido el ratón encima del nodo 29 para apreciar mejor el peso de sus enlaces:
<a href="/sites/default/files/2019-08/force_directed_graph_04.jpg"></a>
Sustituyamos los identificadores de los empleados por sus nombres...
Otro campo que ofrece la visualización es el de <em>Tipo de vínculo</em>. Agregar este campo a la visualización no la modifica desde un punto de vista gráfico, pero nos permite filtrar externamente los enlaces que nos interesan. Por ejemplo, en la siguiente imagen se ha llevado un campo <em>Type</em> (con el tipo de enlace) al campo mencionado de la visualización. Este campo divide los enlaces en tres tipos: A, B y C. Y una segmentación externa nos permite mostrar solo los enlaces de tipo A, por ejemplo:
<a href="/sites/default/files/2019-08/force_directed_graph_05.jpg"></a>
Otros dos campos adicionales, <em>Tipo de origen</em> y <em>Tipo de destino</em> nos permitirían clasificar los nodos de origen y destino de los enlaces, permitiendo filtrar la red según estos dos nuevos criterios.
La visualización no ofrece demasiadas opciones de personalización. Podemos modificar los colores de los enlaces (en función de su peso o tipo de vínculo), cambiar los círculos por una imagen externa accesible vía URL y poco más... No es posible, por ejemplo, modificar el color de los nodos, ni el color por defecto de los enlaces, ni añadir una imagen a éstos (por ejemplo, la fotografía del empleado). Se agradecería poder dar colores a los nodos en función de su tipo, número de enlaces que entran o salen, etc.
Es de destacar también que un clic en un nodo no filtra el resto de visualizaciones del informe, lo que limita también su funcionalidad.
En todo caso, se trata de una buena visualización, y bastante versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-a1d30cc6-26b6-4a1c-9aad-54a40a21c2da') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización permite mostrar una red de elementos relacionados, ofreciendo una buena cantidad de herramientas para configurar los enlaces que la forman. El panel de configuración es el siguiente:
<a href="/sites/default/files/2019-08/force_directed_graph_01.jpg"></a>
Los únicos campos obligatorios son los dos primeros: <em>Origen</em> y <em>Destino</em>. Nuestros empleados (identificados por un código) están organizados en red, estructura que se define en una tabla, <em>Network</em>, que contiene el campo <em>From</em> (representando el supervisor) y el campo <em>To</em> (representando el subordinado). Llevemos estos dos campos a los campos mencionados de la visualización):
<a href="/sites/default/files/2019-08/force_directed_graph_02.jpg"></a>
Se muestra la estructura en red de los trabajadores. Por defecto, el tamaño de cada nodo es proporcional al número de enlaces que llegan o salen de él. Si movemos el cursor encima de uno de los nodos, se muestran en rojo sus enlaces:
<a href="/sites/default/files/2019-08/force_directed_graph_03.jpg"></a>
Es necesario comentar que la red se crea con una interesante animación que nos permite pinchar y arrastrar un nodo, arrastrando consigo el resto de la red. Es posible mostrar la dirección del enlace en <em>Formato > Vínculos > Flecha</em> (véase siguiente imagen). También podemos llevar al campo <em>Peso</em> de la visualización un campo de nuestro modelo de datos que determine el "peso" de cada enlace (sea cual sea la interpretación que esto tenga en el mundo real). En la siguiente imagen se ha llevado un campo <em>Weight</em> conteniendo esta información al campo <em>Peso</em> de la visualización y se ha movido el ratón encima del nodo 29 para apreciar mejor el peso de sus enlaces:
<a href="/sites/default/files/2019-08/force_directed_graph_04.jpg"></a>
Sustituyamos los identificadores de los empleados por sus nombres...
Otro campo que ofrece la visualización es el de <em>Tipo de vínculo</em>. Agregar este campo a la visualización no la modifica desde un punto de vista gráfico, pero nos permite filtrar externamente los enlaces que nos interesan. Por ejemplo, en la siguiente imagen se ha llevado un campo <em>Type</em> (con el tipo de enlace) al campo mencionado de la visualización. Este campo divide los enlaces en tres tipos: A, B y C. Y una segmentación externa nos permite mostrar solo los enlaces de tipo A, por ejemplo:
<a href="/sites/default/files/2019-08/force_directed_graph_05.jpg"></a>
Otros dos campos adicionales, <em>Tipo de origen</em> y <em>Tipo de destino</em> nos permitirían clasificar los nodos de origen y destino de los enlaces, permitiendo filtrar la red según estos dos nuevos criterios.
La visualización no ofrece demasiadas opciones de personalización. Podemos modificar los colores de los enlaces (en función de su peso o tipo de vínculo), cambiar los círculos por una imagen externa accesible vía URL y poco más... No es posible, por ejemplo, modificar el color de los nodos, ni el color por defecto de los enlaces, ni añadir una imagen a éstos (por ejemplo, la fotografía del empleado). Se agradecería poder dar colores a los nodos en función de su tipo, número de enlaces que entran o salen, etc.
Es de destacar también que un clic en un nodo no filtra el resto de visualizaciones del informe, lo que limita también su funcionalidad.
En todo caso, se trata de una buena visualización, y bastante versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-a1d30cc6-26b6-4a1c-9aad-54a40a21c2da') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización permite mostrar una red de elementos relacionados, ofreciendo una buena cantidad de herramientas para configurar los enlaces que la forman. El panel de configuración es el siguiente:
<a href="/sites/default/files/2019-08/force_directed_graph_01.jpg"></a>
Los únicos campos obligatorios son los dos primeros: <em>Origen</em> y <em>Destino</em>. Nuestros empleados (identificados por un código) están organizados en red, estructura que se define en una tabla, <em>Network</em>, que contiene el campo <em>From</em> (representando el supervisor) y el campo <em>To</em> (representando el subordinado). Llevemos estos dos campos a los campos mencionados de la visualización):
<a href="/sites/default/files/2019-08/force_directed_graph_02.jpg"></a>
Se muestra la estructura en red de los trabajadores. Por defecto, el tamaño de cada nodo es proporcional al número de enlaces que llegan o salen de él. Si movemos el cursor encima de uno de los nodos, se muestran en rojo sus enlaces:
<a href="/sites/default/files/2019-08/force_directed_graph_03.jpg"></a>
Es necesario comentar que la red se crea con una interesante animación que nos permite pinchar y arrastrar un nodo, arrastrando consigo el resto de la red. Es posible mostrar la dirección del enlace en <em>Formato > Vínculos > Flecha</em> (véase siguiente imagen). También podemos llevar al campo <em>Peso</em> de la visualización un campo de nuestro modelo de datos que determine el "peso" de cada enlace (sea cual sea la interpretación que esto tenga en el mundo real). En la siguiente imagen se ha llevado un campo <em>Weight</em> conteniendo esta información al campo <em>Peso</em> de la visualización y se ha movido el ratón encima del nodo 29 para apreciar mejor el peso de sus enlaces:
<a href="/sites/default/files/2019-08/force_directed_graph_04.jpg"></a>
Sustituyamos los identificadores de los empleados por sus nombres...
Otro campo que ofrece la visualización es el de <em>Tipo de vínculo</em>. Agregar este campo a la visualización no la modifica desde un punto de vista gráfico, pero nos permite filtrar externamente los enlaces que nos interesan. Por ejemplo, en la siguiente imagen se ha llevado un campo <em>Type</em> (con el tipo de enlace) al campo mencionado de la visualización. Este campo divide los enlaces en tres tipos: A, B y C. Y una segmentación externa nos permite mostrar solo los enlaces de tipo A, por ejemplo:
<a href="/sites/default/files/2019-08/force_directed_graph_05.jpg"></a>
Otros dos campos adicionales, <em>Tipo de origen</em> y <em>Tipo de destino</em> nos permitirían clasificar los nodos de origen y destino de los enlaces, permitiendo filtrar la red según estos dos nuevos criterios.
La visualización no ofrece demasiadas opciones de personalización. Podemos modificar los colores de los enlaces (en función de su peso o tipo de vínculo), cambiar los círculos por una imagen externa accesible vía URL y poco más... No es posible, por ejemplo, modificar el color de los nodos, ni el color por defecto de los enlaces, ni añadir una imagen a éstos (por ejemplo, la fotografía del empleado). Se agradecería poder dar colores a los nodos en función de su tipo, número de enlaces que entran o salen, etc.
Es de destacar también que un clic en un nodo no filtra el resto de visualizaciones del informe, lo que limita también su funcionalidad.
En todo caso, se trata de una buena visualización, y bastante versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-59e9fce8-db97-44ee-bee6-7124257b6595') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización permite mostrar una red de elementos relacionados, ofreciendo una buena cantidad de herramientas para configurar los enlaces que la forman. El panel de configuración es el siguiente:
<a href="/sites/default/files/2019-08/force_directed_graph_01.jpg"></a>
Los únicos campos obligatorios son los dos primeros: <em>Origen</em> y <em>Destino</em>. Nuestros empleados (identificados por un código) están organizados en red, estructura que se define en una tabla, <em>Network</em>, que contiene el campo <em>From</em> (representando el supervisor) y el campo <em>To</em> (representando el subordinado). Llevemos estos dos campos a los campos mencionados de la visualización):
<a href="/sites/default/files/2019-08/force_directed_graph_02.jpg"></a>
Se muestra la estructura en red de los trabajadores. Por defecto, el tamaño de cada nodo es proporcional al número de enlaces que llegan o salen de él. Si movemos el cursor encima de uno de los nodos, se muestran en rojo sus enlaces:
<a href="/sites/default/files/2019-08/force_directed_graph_03.jpg"></a>
Es necesario comentar que la red se crea con una interesante animación que nos permite pinchar y arrastrar un nodo, arrastrando consigo el resto de la red. Es posible mostrar la dirección del enlace en <em>Formato > Vínculos > Flecha</em> (véase siguiente imagen). También podemos llevar al campo <em>Peso</em> de la visualización un campo de nuestro modelo de datos que determine el "peso" de cada enlace (sea cual sea la interpretación que esto tenga en el mundo real). En la siguiente imagen se ha llevado un campo <em>Weight</em> conteniendo esta información al campo <em>Peso</em> de la visualización y se ha movido el ratón encima del nodo 29 para apreciar mejor el peso de sus enlaces:
<a href="/sites/default/files/2019-08/force_directed_graph_04.jpg"></a>
Sustituyamos los identificadores de los empleados por sus nombres...
Otro campo que ofrece la visualización es el de <em>Tipo de vínculo</em>. Agregar este campo a la visualización no la modifica desde un punto de vista gráfico, pero nos permite filtrar externamente los enlaces que nos interesan. Por ejemplo, en la siguiente imagen se ha llevado un campo <em>Type</em> (con el tipo de enlace) al campo mencionado de la visualización. Este campo divide los enlaces en tres tipos: A, B y C. Y una segmentación externa nos permite mostrar solo los enlaces de tipo A, por ejemplo:
<a href="/sites/default/files/2019-08/force_directed_graph_05.jpg"></a>
Otros dos campos adicionales, <em>Tipo de origen</em> y <em>Tipo de destino</em> nos permitirían clasificar los nodos de origen y destino de los enlaces, permitiendo filtrar la red según estos dos nuevos criterios.
La visualización no ofrece demasiadas opciones de personalización. Podemos modificar los colores de los enlaces (en función de su peso o tipo de vínculo), cambiar los círculos por una imagen externa accesible vía URL y poco más... No es posible, por ejemplo, modificar el color de los nodos, ni el color por defecto de los enlaces, ni añadir una imagen a éstos (por ejemplo, la fotografía del empleado). Se agradecería poder dar colores a los nodos en función de su tipo, número de enlaces que entran o salen, etc.
Es de destacar también que un clic en un nodo no filtra el resto de visualizaciones del informe, lo que limita también su funcionalidad.
En todo caso, se trata de una buena visualización, y bastante versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-59e9fce8-db97-44ee-bee6-7124257b6595') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización permite mostrar una red de elementos relacionados, ofreciendo una buena cantidad de herramientas para configurar los enlaces que la forman. El panel de configuración es el siguiente:
<a href="/sites/default/files/2019-08/force_directed_graph_01.jpg"></a>
Los únicos campos obligatorios son los dos primeros: <em>Origen</em> y <em>Destino</em>. Nuestros empleados (identificados por un código) están organizados en red, estructura que se define en una tabla, <em>Network</em>, que contiene el campo <em>From</em> (representando el supervisor) y el campo <em>To</em> (representando el subordinado). Llevemos estos dos campos a los campos mencionados de la visualización):
<a href="/sites/default/files/2019-08/force_directed_graph_02.jpg"></a>
Se muestra la estructura en red de los trabajadores. Por defecto, el tamaño de cada nodo es proporcional al número de enlaces que llegan o salen de él. Si movemos el cursor encima de uno de los nodos, se muestran en rojo sus enlaces:
<a href="/sites/default/files/2019-08/force_directed_graph_03.jpg"></a>
Es necesario comentar que la red se crea con una interesante animación que nos permite pinchar y arrastrar un nodo, arrastrando consigo el resto de la red. Es posible mostrar la dirección del enlace en <em>Formato > Vínculos > Flecha</em> (véase siguiente imagen). También podemos llevar al campo <em>Peso</em> de la visualización un campo de nuestro modelo de datos que determine el "peso" de cada enlace (sea cual sea la interpretación que esto tenga en el mundo real). En la siguiente imagen se ha llevado un campo <em>Weight</em> conteniendo esta información al campo <em>Peso</em> de la visualización y se ha movido el ratón encima del nodo 29 para apreciar mejor el peso de sus enlaces:
<a href="/sites/default/files/2019-08/force_directed_graph_04.jpg"></a>
Sustituyamos los identificadores de los empleados por sus nombres...
Otro campo que ofrece la visualización es el de <em>Tipo de vínculo</em>. Agregar este campo a la visualización no la modifica desde un punto de vista gráfico, pero nos permite filtrar externamente los enlaces que nos interesan. Por ejemplo, en la siguiente imagen se ha llevado un campo <em>Type</em> (con el tipo de enlace) al campo mencionado de la visualización. Este campo divide los enlaces en tres tipos: A, B y C. Y una segmentación externa nos permite mostrar solo los enlaces de tipo A, por ejemplo:
<a href="/sites/default/files/2019-08/force_directed_graph_05.jpg"></a>
Otros dos campos adicionales, <em>Tipo de origen</em> y <em>Tipo de destino</em> nos permitirían clasificar los nodos de origen y destino de los enlaces, permitiendo filtrar la red según estos dos nuevos criterios.
La visualización no ofrece demasiadas opciones de personalización. Podemos modificar los colores de los enlaces (en función de su peso o tipo de vínculo), cambiar los círculos por una imagen externa accesible vía URL y poco más... No es posible, por ejemplo, modificar el color de los nodos, ni el color por defecto de los enlaces, ni añadir una imagen a éstos (por ejemplo, la fotografía del empleado). Se agradecería poder dar colores a los nodos en función de su tipo, número de enlaces que entran o salen, etc.
Es de destacar también que un clic en un nodo no filtra el resto de visualizaciones del informe, lo que limita también su funcionalidad.
En todo caso, se trata de una buena visualización, y bastante versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-59e9fce8-db97-44ee-bee6-7124257b6595') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización permite mostrar una red de elementos relacionados, ofreciendo una buena cantidad de herramientas para configurar los enlaces que la forman. El panel de configuración es el siguiente:
<a href="/sites/default/files/2019-08/force_directed_graph_01.jpg"></a>
Los únicos campos obligatorios son los dos primeros: <em>Origen</em> y <em>Destino</em>. Nuestros empleados (identificados por un código) están organizados en red, estructura que se define en una tabla, <em>Network</em>, que contiene el campo <em>From</em> (representando el supervisor) y el campo <em>To</em> (representando el subordinado). Llevemos estos dos campos a los campos mencionados de la visualización):
<a href="/sites/default/files/2019-08/force_directed_graph_02.jpg"></a>
Se muestra la estructura en red de los trabajadores. Por defecto, el tamaño de cada nodo es proporcional al número de enlaces que llegan o salen de él. Si movemos el cursor encima de uno de los nodos, se muestran en rojo sus enlaces:
<a href="/sites/default/files/2019-08/force_directed_graph_03.jpg"></a>
Es necesario comentar que la red se crea con una interesante animación que nos permite pinchar y arrastrar un nodo, arrastrando consigo el resto de la red. Es posible mostrar la dirección del enlace en <em>Formato > Vínculos > Flecha</em> (véase siguiente imagen). También podemos llevar al campo <em>Peso</em> de la visualización un campo de nuestro modelo de datos que determine el "peso" de cada enlace (sea cual sea la interpretación que esto tenga en el mundo real). En la siguiente imagen se ha llevado un campo <em>Weight</em> conteniendo esta información al campo <em>Peso</em> de la visualización y se ha movido el ratón encima del nodo 29 para apreciar mejor el peso de sus enlaces:
<a href="/sites/default/files/2019-08/force_directed_graph_04.jpg"></a>
Sustituyamos los identificadores de los empleados por sus nombres...
Otro campo que ofrece la visualización es el de <em>Tipo de vínculo</em>. Agregar este campo a la visualización no la modifica desde un punto de vista gráfico, pero nos permite filtrar externamente los enlaces que nos interesan. Por ejemplo, en la siguiente imagen se ha llevado un campo <em>Type</em> (con el tipo de enlace) al campo mencionado de la visualización. Este campo divide los enlaces en tres tipos: A, B y C. Y una segmentación externa nos permite mostrar solo los enlaces de tipo A, por ejemplo:
<a href="/sites/default/files/2019-08/force_directed_graph_05.jpg"></a>
Otros dos campos adicionales, <em>Tipo de origen</em> y <em>Tipo de destino</em> nos permitirían clasificar los nodos de origen y destino de los enlaces, permitiendo filtrar la red según estos dos nuevos criterios.
La visualización no ofrece demasiadas opciones de personalización. Podemos modificar los colores de los enlaces (en función de su peso o tipo de vínculo), cambiar los círculos por una imagen externa accesible vía URL y poco más... No es posible, por ejemplo, modificar el color de los nodos, ni el color por defecto de los enlaces, ni añadir una imagen a éstos (por ejemplo, la fotografía del empleado). Se agradecería poder dar colores a los nodos en función de su tipo, número de enlaces que entran o salen, etc.
Es de destacar también que un clic en un nodo no filtra el resto de visualizaciones del informe, lo que limita también su funcionalidad.
En todo caso, se trata de una buena visualización, y bastante versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-59e9fce8-db97-44ee-bee6-7124257b6595') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización permite mostrar una red de elementos relacionados, ofreciendo una buena cantidad de herramientas para configurar los enlaces que la forman. El panel de configuración es el siguiente:
<a href="/sites/default/files/2019-08/force_directed_graph_01.jpg"></a>
Los únicos campos obligatorios son los dos primeros: <em>Origen</em> y <em>Destino</em>. Nuestros empleados (identificados por un código) están organizados en red, estructura que se define en una tabla, <em>Network</em>, que contiene el campo <em>From</em> (representando el supervisor) y el campo <em>To</em> (representando el subordinado). Llevemos estos dos campos a los campos mencionados de la visualización):
<a href="/sites/default/files/2019-08/force_directed_graph_02.jpg"></a>
Se muestra la estructura en red de los trabajadores. Por defecto, el tamaño de cada nodo es proporcional al número de enlaces que llegan o salen de él. Si movemos el cursor encima de uno de los nodos, se muestran en rojo sus enlaces:
<a href="/sites/default/files/2019-08/force_directed_graph_03.jpg"></a>
Es necesario comentar que la red se crea con una interesante animación que nos permite pinchar y arrastrar un nodo, arrastrando consigo el resto de la red. Es posible mostrar la dirección del enlace en <em>Formato > Vínculos > Flecha</em> (véase siguiente imagen). También podemos llevar al campo <em>Peso</em> de la visualización un campo de nuestro modelo de datos que determine el "peso" de cada enlace (sea cual sea la interpretación que esto tenga en el mundo real). En la siguiente imagen se ha llevado un campo <em>Weight</em> conteniendo esta información al campo <em>Peso</em> de la visualización y se ha movido el ratón encima del nodo 29 para apreciar mejor el peso de sus enlaces:
<a href="/sites/default/files/2019-08/force_directed_graph_04.jpg"></a>
Sustituyamos los identificadores de los empleados por sus nombres...
Otro campo que ofrece la visualización es el de <em>Tipo de vínculo</em>. Agregar este campo a la visualización no la modifica desde un punto de vista gráfico, pero nos permite filtrar externamente los enlaces que nos interesan. Por ejemplo, en la siguiente imagen se ha llevado un campo <em>Type</em> (con el tipo de enlace) al campo mencionado de la visualización. Este campo divide los enlaces en tres tipos: A, B y C. Y una segmentación externa nos permite mostrar solo los enlaces de tipo A, por ejemplo:
<a href="/sites/default/files/2019-08/force_directed_graph_05.jpg"></a>
Otros dos campos adicionales, <em>Tipo de origen</em> y <em>Tipo de destino</em> nos permitirían clasificar los nodos de origen y destino de los enlaces, permitiendo filtrar la red según estos dos nuevos criterios.
La visualización no ofrece demasiadas opciones de personalización. Podemos modificar los colores de los enlaces (en función de su peso o tipo de vínculo), cambiar los círculos por una imagen externa accesible vía URL y poco más... No es posible, por ejemplo, modificar el color de los nodos, ni el color por defecto de los enlaces, ni añadir una imagen a éstos (por ejemplo, la fotografía del empleado). Se agradecería poder dar colores a los nodos en función de su tipo, número de enlaces que entran o salen, etc.
Es de destacar también que un clic en un nodo no filtra el resto de visualizaciones del informe, lo que limita también su funcionalidad.
En todo caso, se trata de una buena visualización, y bastante versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-fc9d5936-6e75-482a-8602-f675c31450c5') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización permite mostrar una red de elementos relacionados, ofreciendo una buena cantidad de herramientas para configurar los enlaces que la forman. El panel de configuración es el siguiente:
<a href="/sites/default/files/2019-08/force_directed_graph_01.jpg"></a>
Los únicos campos obligatorios son los dos primeros: <em>Origen</em> y <em>Destino</em>. Nuestros empleados (identificados por un código) están organizados en red, estructura que se define en una tabla, <em>Network</em>, que contiene el campo <em>From</em> (representando el supervisor) y el campo <em>To</em> (representando el subordinado). Llevemos estos dos campos a los campos mencionados de la visualización):
<a href="/sites/default/files/2019-08/force_directed_graph_02.jpg"></a>
Se muestra la estructura en red de los trabajadores. Por defecto, el tamaño de cada nodo es proporcional al número de enlaces que llegan o salen de él. Si movemos el cursor encima de uno de los nodos, se muestran en rojo sus enlaces:
<a href="/sites/default/files/2019-08/force_directed_graph_03.jpg"></a>
Es necesario comentar que la red se crea con una interesante animación que nos permite pinchar y arrastrar un nodo, arrastrando consigo el resto de la red. Es posible mostrar la dirección del enlace en <em>Formato > Vínculos > Flecha</em> (véase siguiente imagen). También podemos llevar al campo <em>Peso</em> de la visualización un campo de nuestro modelo de datos que determine el "peso" de cada enlace (sea cual sea la interpretación que esto tenga en el mundo real). En la siguiente imagen se ha llevado un campo <em>Weight</em> conteniendo esta información al campo <em>Peso</em> de la visualización y se ha movido el ratón encima del nodo 29 para apreciar mejor el peso de sus enlaces:
<a href="/sites/default/files/2019-08/force_directed_graph_04.jpg"></a>
Sustituyamos los identificadores de los empleados por sus nombres...
Otro campo que ofrece la visualización es el de <em>Tipo de vínculo</em>. Agregar este campo a la visualización no la modifica desde un punto de vista gráfico, pero nos permite filtrar externamente los enlaces que nos interesan. Por ejemplo, en la siguiente imagen se ha llevado un campo <em>Type</em> (con el tipo de enlace) al campo mencionado de la visualización. Este campo divide los enlaces en tres tipos: A, B y C. Y una segmentación externa nos permite mostrar solo los enlaces de tipo A, por ejemplo:
<a href="/sites/default/files/2019-08/force_directed_graph_05.jpg"></a>
Otros dos campos adicionales, <em>Tipo de origen</em> y <em>Tipo de destino</em> nos permitirían clasificar los nodos de origen y destino de los enlaces, permitiendo filtrar la red según estos dos nuevos criterios.
La visualización no ofrece demasiadas opciones de personalización. Podemos modificar los colores de los enlaces (en función de su peso o tipo de vínculo), cambiar los círculos por una imagen externa accesible vía URL y poco más... No es posible, por ejemplo, modificar el color de los nodos, ni el color por defecto de los enlaces, ni añadir una imagen a éstos (por ejemplo, la fotografía del empleado). Se agradecería poder dar colores a los nodos en función de su tipo, número de enlaces que entran o salen, etc.
Es de destacar también que un clic en un nodo no filtra el resto de visualizaciones del informe, lo que limita también su funcionalidad.
En todo caso, se trata de una buena visualización, y bastante versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-fc9d5936-6e75-482a-8602-f675c31450c5') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización permite mostrar una red de elementos relacionados, ofreciendo una buena cantidad de herramientas para configurar los enlaces que la forman. El panel de configuración es el siguiente:
<a href="/sites/default/files/2019-08/force_directed_graph_01.jpg"></a>
Los únicos campos obligatorios son los dos primeros: <em>Origen</em> y <em>Destino</em>. Nuestros empleados (identificados por un código) están organizados en red, estructura que se define en una tabla, <em>Network</em>, que contiene el campo <em>From</em> (representando el supervisor) y el campo <em>To</em> (representando el subordinado). Llevemos estos dos campos a los campos mencionados de la visualización):
<a href="/sites/default/files/2019-08/force_directed_graph_02.jpg"></a>
Se muestra la estructura en red de los trabajadores. Por defecto, el tamaño de cada nodo es proporcional al número de enlaces que llegan o salen de él. Si movemos el cursor encima de uno de los nodos, se muestran en rojo sus enlaces:
<a href="/sites/default/files/2019-08/force_directed_graph_03.jpg"></a>
Es necesario comentar que la red se crea con una interesante animación que nos permite pinchar y arrastrar un nodo, arrastrando consigo el resto de la red. Es posible mostrar la dirección del enlace en <em>Formato > Vínculos > Flecha</em> (véase siguiente imagen). También podemos llevar al campo <em>Peso</em> de la visualización un campo de nuestro modelo de datos que determine el "peso" de cada enlace (sea cual sea la interpretación que esto tenga en el mundo real). En la siguiente imagen se ha llevado un campo <em>Weight</em> conteniendo esta información al campo <em>Peso</em> de la visualización y se ha movido el ratón encima del nodo 29 para apreciar mejor el peso de sus enlaces:
<a href="/sites/default/files/2019-08/force_directed_graph_04.jpg"></a>
Sustituyamos los identificadores de los empleados por sus nombres...
Otro campo que ofrece la visualización es el de <em>Tipo de vínculo</em>. Agregar este campo a la visualización no la modifica desde un punto de vista gráfico, pero nos permite filtrar externamente los enlaces que nos interesan. Por ejemplo, en la siguiente imagen se ha llevado un campo <em>Type</em> (con el tipo de enlace) al campo mencionado de la visualización. Este campo divide los enlaces en tres tipos: A, B y C. Y una segmentación externa nos permite mostrar solo los enlaces de tipo A, por ejemplo:
<a href="/sites/default/files/2019-08/force_directed_graph_05.jpg"></a>
Otros dos campos adicionales, <em>Tipo de origen</em> y <em>Tipo de destino</em> nos permitirían clasificar los nodos de origen y destino de los enlaces, permitiendo filtrar la red según estos dos nuevos criterios.
La visualización no ofrece demasiadas opciones de personalización. Podemos modificar los colores de los enlaces (en función de su peso o tipo de vínculo), cambiar los círculos por una imagen externa accesible vía URL y poco más... No es posible, por ejemplo, modificar el color de los nodos, ni el color por defecto de los enlaces, ni añadir una imagen a éstos (por ejemplo, la fotografía del empleado). Se agradecería poder dar colores a los nodos en función de su tipo, número de enlaces que entran o salen, etc.
Es de destacar también que un clic en un nodo no filtra el resto de visualizaciones del informe, lo que limita también su funcionalidad.
En todo caso, se trata de una buena visualización, y bastante versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-fc9d5936-6e75-482a-8602-f675c31450c5') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización permite mostrar una red de elementos relacionados, ofreciendo una buena cantidad de herramientas para configurar los enlaces que la forman. El panel de configuración es el siguiente:
<a href="/sites/default/files/2019-08/force_directed_graph_01.jpg"></a>
Los únicos campos obligatorios son los dos primeros: <em>Origen</em> y <em>Destino</em>. Nuestros empleados (identificados por un código) están organizados en red, estructura que se define en una tabla, <em>Network</em>, que contiene el campo <em>From</em> (representando el supervisor) y el campo <em>To</em> (representando el subordinado). Llevemos estos dos campos a los campos mencionados de la visualización):
<a href="/sites/default/files/2019-08/force_directed_graph_02.jpg"></a>
Se muestra la estructura en red de los trabajadores. Por defecto, el tamaño de cada nodo es proporcional al número de enlaces que llegan o salen de él. Si movemos el cursor encima de uno de los nodos, se muestran en rojo sus enlaces:
<a href="/sites/default/files/2019-08/force_directed_graph_03.jpg"></a>
Es necesario comentar que la red se crea con una interesante animación que nos permite pinchar y arrastrar un nodo, arrastrando consigo el resto de la red. Es posible mostrar la dirección del enlace en <em>Formato > Vínculos > Flecha</em> (véase siguiente imagen). También podemos llevar al campo <em>Peso</em> de la visualización un campo de nuestro modelo de datos que determine el "peso" de cada enlace (sea cual sea la interpretación que esto tenga en el mundo real). En la siguiente imagen se ha llevado un campo <em>Weight</em> conteniendo esta información al campo <em>Peso</em> de la visualización y se ha movido el ratón encima del nodo 29 para apreciar mejor el peso de sus enlaces:
<a href="/sites/default/files/2019-08/force_directed_graph_04.jpg"></a>
Sustituyamos los identificadores de los empleados por sus nombres...
Otro campo que ofrece la visualización es el de <em>Tipo de vínculo</em>. Agregar este campo a la visualización no la modifica desde un punto de vista gráfico, pero nos permite filtrar externamente los enlaces que nos interesan. Por ejemplo, en la siguiente imagen se ha llevado un campo <em>Type</em> (con el tipo de enlace) al campo mencionado de la visualización. Este campo divide los enlaces en tres tipos: A, B y C. Y una segmentación externa nos permite mostrar solo los enlaces de tipo A, por ejemplo:
<a href="/sites/default/files/2019-08/force_directed_graph_05.jpg"></a>
Otros dos campos adicionales, <em>Tipo de origen</em> y <em>Tipo de destino</em> nos permitirían clasificar los nodos de origen y destino de los enlaces, permitiendo filtrar la red según estos dos nuevos criterios.
La visualización no ofrece demasiadas opciones de personalización. Podemos modificar los colores de los enlaces (en función de su peso o tipo de vínculo), cambiar los círculos por una imagen externa accesible vía URL y poco más... No es posible, por ejemplo, modificar el color de los nodos, ni el color por defecto de los enlaces, ni añadir una imagen a éstos (por ejemplo, la fotografía del empleado). Se agradecería poder dar colores a los nodos en función de su tipo, número de enlaces que entran o salen, etc.
Es de destacar también que un clic en un nodo no filtra el resto de visualizaciones del informe, lo que limita también su funcionalidad.
En todo caso, se trata de una buena visualización, y bastante versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-fc9d5936-6e75-482a-8602-f675c31450c5') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización permite mostrar una red de elementos relacionados, ofreciendo una buena cantidad de herramientas para configurar los enlaces que la forman. El panel de configuración es el siguiente:
<a href="/sites/default/files/2019-08/force_directed_graph_01.jpg"></a>
Los únicos campos obligatorios son los dos primeros: <em>Origen</em> y <em>Destino</em>. Nuestros empleados (identificados por un código) están organizados en red, estructura que se define en una tabla, <em>Network</em>, que contiene el campo <em>From</em> (representando el supervisor) y el campo <em>To</em> (representando el subordinado). Llevemos estos dos campos a los campos mencionados de la visualización):
<a href="/sites/default/files/2019-08/force_directed_graph_02.jpg"></a>
Se muestra la estructura en red de los trabajadores. Por defecto, el tamaño de cada nodo es proporcional al número de enlaces que llegan o salen de él. Si movemos el cursor encima de uno de los nodos, se muestran en rojo sus enlaces:
<a href="/sites/default/files/2019-08/force_directed_graph_03.jpg"></a>
Es necesario comentar que la red se crea con una interesante animación que nos permite pinchar y arrastrar un nodo, arrastrando consigo el resto de la red. Es posible mostrar la dirección del enlace en <em>Formato > Vínculos > Flecha</em> (véase siguiente imagen). También podemos llevar al campo <em>Peso</em> de la visualización un campo de nuestro modelo de datos que determine el "peso" de cada enlace (sea cual sea la interpretación que esto tenga en el mundo real). En la siguiente imagen se ha llevado un campo <em>Weight</em> conteniendo esta información al campo <em>Peso</em> de la visualización y se ha movido el ratón encima del nodo 29 para apreciar mejor el peso de sus enlaces:
<a href="/sites/default/files/2019-08/force_directed_graph_04.jpg"></a>
Sustituyamos los identificadores de los empleados por sus nombres...
Otro campo que ofrece la visualización es el de <em>Tipo de vínculo</em>. Agregar este campo a la visualización no la modifica desde un punto de vista gráfico, pero nos permite filtrar externamente los enlaces que nos interesan. Por ejemplo, en la siguiente imagen se ha llevado un campo <em>Type</em> (con el tipo de enlace) al campo mencionado de la visualización. Este campo divide los enlaces en tres tipos: A, B y C. Y una segmentación externa nos permite mostrar solo los enlaces de tipo A, por ejemplo:
<a href="/sites/default/files/2019-08/force_directed_graph_05.jpg"></a>
Otros dos campos adicionales, <em>Tipo de origen</em> y <em>Tipo de destino</em> nos permitirían clasificar los nodos de origen y destino de los enlaces, permitiendo filtrar la red según estos dos nuevos criterios.
La visualización no ofrece demasiadas opciones de personalización. Podemos modificar los colores de los enlaces (en función de su peso o tipo de vínculo), cambiar los círculos por una imagen externa accesible vía URL y poco más... No es posible, por ejemplo, modificar el color de los nodos, ni el color por defecto de los enlaces, ni añadir una imagen a éstos (por ejemplo, la fotografía del empleado). Se agradecería poder dar colores a los nodos en función de su tipo, número de enlaces que entran o salen, etc.
Es de destacar también que un clic en un nodo no filtra el resto de visualizaciones del informe, lo que limita también su funcionalidad.
En todo caso, se trata de una buena visualización, y bastante versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-2e0edb4f-671a-4d1b-94e0-e5ce91f2a239') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Cluster Map</strong> muestra información -supuestamente agrupada en clusters según algún criterio- en forma de nube de imágenes. Su configuración es la mostrada en la siguiente imagen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_01.jpg"></a>
Los únicos campos obligatorios son los tres primeros: <em>Cluster ID</em> (identificador de los elementos a mostrar, no de los supuestos clusters -salvo que en esta visualización se denomine cluster a cada uno de los elementos-), <em>Label</em> (etiqueta de cada uno de los elementos a mostrar) y <em>Count</em> (métrica que va a asociarse a los elementos y que va a determinar su ordenación en la visualización).
Supongamos que queremos mostrar los mejores vendedores de nuestra empresa: Arrastremos el campo <em>Employee Id</em> de nuestra tabla de vendedores al campo <em>Cluster ID</em>, el campo <em>Full Name</em> (nombre del vendedor) al campo <em>Label</em>, y la medida <em>Sales</em> (suma de la cifra de ventas en el contexto actual) a <em>Count</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_02.jpg"></a>
Como puede verse, los vendedores con mayor cifra de ventas se representan con círculos de mayor tamaño, permitiendo fácilmente identificar a los mejores. Por otro lado, ni los tamaños ni los radios de los círculos son proporcionales a la cifra en cuestión, lo que puede dificultar su interpretación (afortunadamente se muestra la cifra en el medio del círculo).
Si llevamos al campo <em>Image Url</em> de la visualización el campo <em>Picture</em> de nuestra tabla de vendedores -campo que contiene los URLs con las fotografías de éstos- la visualización se actualizará para mostrar las imágenes en cada círculo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_03.jpg"></a>
Vemos en estas últimas dos imágenes un inconveniente adicional de esta visualización: las etiquetas no se muestran correctamente salvo para aquellos elementos con un valor asociado alto (es decir, para elementos con un círculo de suficiente diámetro). Y mover el cursor encima de uno de los elementos no provoca la aparición de la típica ventana flotante con la información asociada, de forma que nunca sabremos ese "Dani..." que se muestra cerca de la esquina superior derecha de la anterior imagen a qué vendedor se refiere (salvo que solo haya un Daniel, por supuesto). Además, para estos elementos con cifras asociadas pequeñas, la imagen resulta prácticamente invisible, lo que no ayuda en la identificación del elemento en cuestión.
El campo <em>Segmented By</em> se supone que sirve para agrupar los elementos en clusters (o, al menos, para segmentar de alguna forma los elementos), pero el cambio que produce su uso en la visualización es prácticamente imposible de interpretar. Por ejemplo, si llevamos el campo <em>Country</em> de nuestro modelo de datos con el fin de identificar a qué país pertenece cada vendedor, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_04.jpg"></a>
La imagen puede parecer idéntica a la anterior pero, si nos fijamos, vemos que ha aparecido un borde en torno a los círculos que se supone que debería permitirnos distinguir los elementos de un país de los de otro (pero no lo permite demasiado bien, para qué decir otra cosa). Si los colores escogidos para cada segmento fuesen personalizables, todavía... pero no lo son.
Los otros tres campos, <em>Related To</em>, <em>Relatedness Strength</em> y <em>Parent Cluster ID</em> sirven -aparentemente, pues no hay documentación a la que recurrir- para asociar los elementos a otros a los que estén relacionados. Por ejemplo, nuestra tabla de vendedores incluye un campo ("<em>Manager</em>") con el identificador del supervisor de cada vendedor (en el modelo de datos que estamos usando no todos los trabajadores tienen un supervisor). Si llevamos este campo al campo <em>Related To</em> de la visualización, los vendedores que tienen un supervisor en el grupo de mejores vendedores se muestran unidos a éstos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_05.jpg"></a>
En la imagen anterior, los grupos de vendedor-supervisor se muestran en el lateral izquierdo y en la parte superior de la visualización.
Los otros dos campos (<em>Relatedness Strength</em> y <em>Parent Cluster ID</em>) no tienen una utilidad fácilmente interpretable.
Un clic en uno de los elementos lo destaca frente al resto y filtra el resto de visualizaciones del informe.
La visualización es muy poco configurable: apenas los colores a mostrar alrededor de un círculo cuando se selecciona, si mostrar las etiquetas o no, si los círculos deberán mostrarse en espiral o en modo "relacional" (qué elementos se relacionan con qué otros) y poco más.
Como resumen, haría falta documentación, mayor capacidad de personalización y resolver los problemas de usabilidad comentados para poder considerar esta visualización verdaderamente útil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-2e0edb4f-671a-4d1b-94e0-e5ce91f2a239') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Cluster Map</strong> muestra información -supuestamente agrupada en clusters según algún criterio- en forma de nube de imágenes. Su configuración es la mostrada en la siguiente imagen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_01.jpg"></a>
Los únicos campos obligatorios son los tres primeros: <em>Cluster ID</em> (identificador de los elementos a mostrar, no de los supuestos clusters -salvo que en esta visualización se denomine cluster a cada uno de los elementos-), <em>Label</em> (etiqueta de cada uno de los elementos a mostrar) y <em>Count</em> (métrica que va a asociarse a los elementos y que va a determinar su ordenación en la visualización).
Supongamos que queremos mostrar los mejores vendedores de nuestra empresa: Arrastremos el campo <em>Employee Id</em> de nuestra tabla de vendedores al campo <em>Cluster ID</em>, el campo <em>Full Name</em> (nombre del vendedor) al campo <em>Label</em>, y la medida <em>Sales</em> (suma de la cifra de ventas en el contexto actual) a <em>Count</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_02.jpg"></a>
Como puede verse, los vendedores con mayor cifra de ventas se representan con círculos de mayor tamaño, permitiendo fácilmente identificar a los mejores. Por otro lado, ni los tamaños ni los radios de los círculos son proporcionales a la cifra en cuestión, lo que puede dificultar su interpretación (afortunadamente se muestra la cifra en el medio del círculo).
Si llevamos al campo <em>Image Url</em> de la visualización el campo <em>Picture</em> de nuestra tabla de vendedores -campo que contiene los URLs con las fotografías de éstos- la visualización se actualizará para mostrar las imágenes en cada círculo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_03.jpg"></a>
Vemos en estas últimas dos imágenes un inconveniente adicional de esta visualización: las etiquetas no se muestran correctamente salvo para aquellos elementos con un valor asociado alto (es decir, para elementos con un círculo de suficiente diámetro). Y mover el cursor encima de uno de los elementos no provoca la aparición de la típica ventana flotante con la información asociada, de forma que nunca sabremos ese "Dani..." que se muestra cerca de la esquina superior derecha de la anterior imagen a qué vendedor se refiere (salvo que solo haya un Daniel, por supuesto). Además, para estos elementos con cifras asociadas pequeñas, la imagen resulta prácticamente invisible, lo que no ayuda en la identificación del elemento en cuestión.
El campo <em>Segmented By</em> se supone que sirve para agrupar los elementos en clusters (o, al menos, para segmentar de alguna forma los elementos), pero el cambio que produce su uso en la visualización es prácticamente imposible de interpretar. Por ejemplo, si llevamos el campo <em>Country</em> de nuestro modelo de datos con el fin de identificar a qué país pertenece cada vendedor, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_04.jpg"></a>
La imagen puede parecer idéntica a la anterior pero, si nos fijamos, vemos que ha aparecido un borde en torno a los círculos que se supone que debería permitirnos distinguir los elementos de un país de los de otro (pero no lo permite demasiado bien, para qué decir otra cosa). Si los colores escogidos para cada segmento fuesen personalizables, todavía... pero no lo son.
Los otros tres campos, <em>Related To</em>, <em>Relatedness Strength</em> y <em>Parent Cluster ID</em> sirven -aparentemente, pues no hay documentación a la que recurrir- para asociar los elementos a otros a los que estén relacionados. Por ejemplo, nuestra tabla de vendedores incluye un campo ("<em>Manager</em>") con el identificador del supervisor de cada vendedor (en el modelo de datos que estamos usando no todos los trabajadores tienen un supervisor). Si llevamos este campo al campo <em>Related To</em> de la visualización, los vendedores que tienen un supervisor en el grupo de mejores vendedores se muestran unidos a éstos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_05.jpg"></a>
En la imagen anterior, los grupos de vendedor-supervisor se muestran en el lateral izquierdo y en la parte superior de la visualización.
Los otros dos campos (<em>Relatedness Strength</em> y <em>Parent Cluster ID</em>) no tienen una utilidad fácilmente interpretable.
Un clic en uno de los elementos lo destaca frente al resto y filtra el resto de visualizaciones del informe.
La visualización es muy poco configurable: apenas los colores a mostrar alrededor de un círculo cuando se selecciona, si mostrar las etiquetas o no, si los círculos deberán mostrarse en espiral o en modo "relacional" (qué elementos se relacionan con qué otros) y poco más.
Como resumen, haría falta documentación, mayor capacidad de personalización y resolver los problemas de usabilidad comentados para poder considerar esta visualización verdaderamente útil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-2e0edb4f-671a-4d1b-94e0-e5ce91f2a239') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Cluster Map</strong> muestra información -supuestamente agrupada en clusters según algún criterio- en forma de nube de imágenes. Su configuración es la mostrada en la siguiente imagen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_01.jpg"></a>
Los únicos campos obligatorios son los tres primeros: <em>Cluster ID</em> (identificador de los elementos a mostrar, no de los supuestos clusters -salvo que en esta visualización se denomine cluster a cada uno de los elementos-), <em>Label</em> (etiqueta de cada uno de los elementos a mostrar) y <em>Count</em> (métrica que va a asociarse a los elementos y que va a determinar su ordenación en la visualización).
Supongamos que queremos mostrar los mejores vendedores de nuestra empresa: Arrastremos el campo <em>Employee Id</em> de nuestra tabla de vendedores al campo <em>Cluster ID</em>, el campo <em>Full Name</em> (nombre del vendedor) al campo <em>Label</em>, y la medida <em>Sales</em> (suma de la cifra de ventas en el contexto actual) a <em>Count</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_02.jpg"></a>
Como puede verse, los vendedores con mayor cifra de ventas se representan con círculos de mayor tamaño, permitiendo fácilmente identificar a los mejores. Por otro lado, ni los tamaños ni los radios de los círculos son proporcionales a la cifra en cuestión, lo que puede dificultar su interpretación (afortunadamente se muestra la cifra en el medio del círculo).
Si llevamos al campo <em>Image Url</em> de la visualización el campo <em>Picture</em> de nuestra tabla de vendedores -campo que contiene los URLs con las fotografías de éstos- la visualización se actualizará para mostrar las imágenes en cada círculo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_03.jpg"></a>
Vemos en estas últimas dos imágenes un inconveniente adicional de esta visualización: las etiquetas no se muestran correctamente salvo para aquellos elementos con un valor asociado alto (es decir, para elementos con un círculo de suficiente diámetro). Y mover el cursor encima de uno de los elementos no provoca la aparición de la típica ventana flotante con la información asociada, de forma que nunca sabremos ese "Dani..." que se muestra cerca de la esquina superior derecha de la anterior imagen a qué vendedor se refiere (salvo que solo haya un Daniel, por supuesto). Además, para estos elementos con cifras asociadas pequeñas, la imagen resulta prácticamente invisible, lo que no ayuda en la identificación del elemento en cuestión.
El campo <em>Segmented By</em> se supone que sirve para agrupar los elementos en clusters (o, al menos, para segmentar de alguna forma los elementos), pero el cambio que produce su uso en la visualización es prácticamente imposible de interpretar. Por ejemplo, si llevamos el campo <em>Country</em> de nuestro modelo de datos con el fin de identificar a qué país pertenece cada vendedor, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_04.jpg"></a>
La imagen puede parecer idéntica a la anterior pero, si nos fijamos, vemos que ha aparecido un borde en torno a los círculos que se supone que debería permitirnos distinguir los elementos de un país de los de otro (pero no lo permite demasiado bien, para qué decir otra cosa). Si los colores escogidos para cada segmento fuesen personalizables, todavía... pero no lo son.
Los otros tres campos, <em>Related To</em>, <em>Relatedness Strength</em> y <em>Parent Cluster ID</em> sirven -aparentemente, pues no hay documentación a la que recurrir- para asociar los elementos a otros a los que estén relacionados. Por ejemplo, nuestra tabla de vendedores incluye un campo ("<em>Manager</em>") con el identificador del supervisor de cada vendedor (en el modelo de datos que estamos usando no todos los trabajadores tienen un supervisor). Si llevamos este campo al campo <em>Related To</em> de la visualización, los vendedores que tienen un supervisor en el grupo de mejores vendedores se muestran unidos a éstos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_05.jpg"></a>
En la imagen anterior, los grupos de vendedor-supervisor se muestran en el lateral izquierdo y en la parte superior de la visualización.
Los otros dos campos (<em>Relatedness Strength</em> y <em>Parent Cluster ID</em>) no tienen una utilidad fácilmente interpretable.
Un clic en uno de los elementos lo destaca frente al resto y filtra el resto de visualizaciones del informe.
La visualización es muy poco configurable: apenas los colores a mostrar alrededor de un círculo cuando se selecciona, si mostrar las etiquetas o no, si los círculos deberán mostrarse en espiral o en modo "relacional" (qué elementos se relacionan con qué otros) y poco más.
Como resumen, haría falta documentación, mayor capacidad de personalización y resolver los problemas de usabilidad comentados para poder considerar esta visualización verdaderamente útil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-2e0edb4f-671a-4d1b-94e0-e5ce91f2a239') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Cluster Map</strong> muestra información -supuestamente agrupada en clusters según algún criterio- en forma de nube de imágenes. Su configuración es la mostrada en la siguiente imagen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_01.jpg"></a>
Los únicos campos obligatorios son los tres primeros: <em>Cluster ID</em> (identificador de los elementos a mostrar, no de los supuestos clusters -salvo que en esta visualización se denomine cluster a cada uno de los elementos-), <em>Label</em> (etiqueta de cada uno de los elementos a mostrar) y <em>Count</em> (métrica que va a asociarse a los elementos y que va a determinar su ordenación en la visualización).
Supongamos que queremos mostrar los mejores vendedores de nuestra empresa: Arrastremos el campo <em>Employee Id</em> de nuestra tabla de vendedores al campo <em>Cluster ID</em>, el campo <em>Full Name</em> (nombre del vendedor) al campo <em>Label</em>, y la medida <em>Sales</em> (suma de la cifra de ventas en el contexto actual) a <em>Count</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_02.jpg"></a>
Como puede verse, los vendedores con mayor cifra de ventas se representan con círculos de mayor tamaño, permitiendo fácilmente identificar a los mejores. Por otro lado, ni los tamaños ni los radios de los círculos son proporcionales a la cifra en cuestión, lo que puede dificultar su interpretación (afortunadamente se muestra la cifra en el medio del círculo).
Si llevamos al campo <em>Image Url</em> de la visualización el campo <em>Picture</em> de nuestra tabla de vendedores -campo que contiene los URLs con las fotografías de éstos- la visualización se actualizará para mostrar las imágenes en cada círculo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_03.jpg"></a>
Vemos en estas últimas dos imágenes un inconveniente adicional de esta visualización: las etiquetas no se muestran correctamente salvo para aquellos elementos con un valor asociado alto (es decir, para elementos con un círculo de suficiente diámetro). Y mover el cursor encima de uno de los elementos no provoca la aparición de la típica ventana flotante con la información asociada, de forma que nunca sabremos ese "Dani..." que se muestra cerca de la esquina superior derecha de la anterior imagen a qué vendedor se refiere (salvo que solo haya un Daniel, por supuesto). Además, para estos elementos con cifras asociadas pequeñas, la imagen resulta prácticamente invisible, lo que no ayuda en la identificación del elemento en cuestión.
El campo <em>Segmented By</em> se supone que sirve para agrupar los elementos en clusters (o, al menos, para segmentar de alguna forma los elementos), pero el cambio que produce su uso en la visualización es prácticamente imposible de interpretar. Por ejemplo, si llevamos el campo <em>Country</em> de nuestro modelo de datos con el fin de identificar a qué país pertenece cada vendedor, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_04.jpg"></a>
La imagen puede parecer idéntica a la anterior pero, si nos fijamos, vemos que ha aparecido un borde en torno a los círculos que se supone que debería permitirnos distinguir los elementos de un país de los de otro (pero no lo permite demasiado bien, para qué decir otra cosa). Si los colores escogidos para cada segmento fuesen personalizables, todavía... pero no lo son.
Los otros tres campos, <em>Related To</em>, <em>Relatedness Strength</em> y <em>Parent Cluster ID</em> sirven -aparentemente, pues no hay documentación a la que recurrir- para asociar los elementos a otros a los que estén relacionados. Por ejemplo, nuestra tabla de vendedores incluye un campo ("<em>Manager</em>") con el identificador del supervisor de cada vendedor (en el modelo de datos que estamos usando no todos los trabajadores tienen un supervisor). Si llevamos este campo al campo <em>Related To</em> de la visualización, los vendedores que tienen un supervisor en el grupo de mejores vendedores se muestran unidos a éstos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_05.jpg"></a>
En la imagen anterior, los grupos de vendedor-supervisor se muestran en el lateral izquierdo y en la parte superior de la visualización.
Los otros dos campos (<em>Relatedness Strength</em> y <em>Parent Cluster ID</em>) no tienen una utilidad fácilmente interpretable.
Un clic en uno de los elementos lo destaca frente al resto y filtra el resto de visualizaciones del informe.
La visualización es muy poco configurable: apenas los colores a mostrar alrededor de un círculo cuando se selecciona, si mostrar las etiquetas o no, si los círculos deberán mostrarse en espiral o en modo "relacional" (qué elementos se relacionan con qué otros) y poco más.
Como resumen, haría falta documentación, mayor capacidad de personalización y resolver los problemas de usabilidad comentados para poder considerar esta visualización verdaderamente útil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-e67056b0-f05f-472e-a1e9-799c31df6a06') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Cluster Map</strong> muestra información -supuestamente agrupada en clusters según algún criterio- en forma de nube de imágenes. Su configuración es la mostrada en la siguiente imagen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_01.jpg"></a>
Los únicos campos obligatorios son los tres primeros: <em>Cluster ID</em> (identificador de los elementos a mostrar, no de los supuestos clusters -salvo que en esta visualización se denomine cluster a cada uno de los elementos-), <em>Label</em> (etiqueta de cada uno de los elementos a mostrar) y <em>Count</em> (métrica que va a asociarse a los elementos y que va a determinar su ordenación en la visualización).
Supongamos que queremos mostrar los mejores vendedores de nuestra empresa: Arrastremos el campo <em>Employee Id</em> de nuestra tabla de vendedores al campo <em>Cluster ID</em>, el campo <em>Full Name</em> (nombre del vendedor) al campo <em>Label</em>, y la medida <em>Sales</em> (suma de la cifra de ventas en el contexto actual) a <em>Count</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_02.jpg"></a>
Como puede verse, los vendedores con mayor cifra de ventas se representan con círculos de mayor tamaño, permitiendo fácilmente identificar a los mejores. Por otro lado, ni los tamaños ni los radios de los círculos son proporcionales a la cifra en cuestión, lo que puede dificultar su interpretación (afortunadamente se muestra la cifra en el medio del círculo).
Si llevamos al campo <em>Image Url</em> de la visualización el campo <em>Picture</em> de nuestra tabla de vendedores -campo que contiene los URLs con las fotografías de éstos- la visualización se actualizará para mostrar las imágenes en cada círculo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_03.jpg"></a>
Vemos en estas últimas dos imágenes un inconveniente adicional de esta visualización: las etiquetas no se muestran correctamente salvo para aquellos elementos con un valor asociado alto (es decir, para elementos con un círculo de suficiente diámetro). Y mover el cursor encima de uno de los elementos no provoca la aparición de la típica ventana flotante con la información asociada, de forma que nunca sabremos ese "Dani..." que se muestra cerca de la esquina superior derecha de la anterior imagen a qué vendedor se refiere (salvo que solo haya un Daniel, por supuesto). Además, para estos elementos con cifras asociadas pequeñas, la imagen resulta prácticamente invisible, lo que no ayuda en la identificación del elemento en cuestión.
El campo <em>Segmented By</em> se supone que sirve para agrupar los elementos en clusters (o, al menos, para segmentar de alguna forma los elementos), pero el cambio que produce su uso en la visualización es prácticamente imposible de interpretar. Por ejemplo, si llevamos el campo <em>Country</em> de nuestro modelo de datos con el fin de identificar a qué país pertenece cada vendedor, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_04.jpg"></a>
La imagen puede parecer idéntica a la anterior pero, si nos fijamos, vemos que ha aparecido un borde en torno a los círculos que se supone que debería permitirnos distinguir los elementos de un país de los de otro (pero no lo permite demasiado bien, para qué decir otra cosa). Si los colores escogidos para cada segmento fuesen personalizables, todavía... pero no lo son.
Los otros tres campos, <em>Related To</em>, <em>Relatedness Strength</em> y <em>Parent Cluster ID</em> sirven -aparentemente, pues no hay documentación a la que recurrir- para asociar los elementos a otros a los que estén relacionados. Por ejemplo, nuestra tabla de vendedores incluye un campo ("<em>Manager</em>") con el identificador del supervisor de cada vendedor (en el modelo de datos que estamos usando no todos los trabajadores tienen un supervisor). Si llevamos este campo al campo <em>Related To</em> de la visualización, los vendedores que tienen un supervisor en el grupo de mejores vendedores se muestran unidos a éstos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_05.jpg"></a>
En la imagen anterior, los grupos de vendedor-supervisor se muestran en el lateral izquierdo y en la parte superior de la visualización.
Los otros dos campos (<em>Relatedness Strength</em> y <em>Parent Cluster ID</em>) no tienen una utilidad fácilmente interpretable.
Un clic en uno de los elementos lo destaca frente al resto y filtra el resto de visualizaciones del informe.
La visualización es muy poco configurable: apenas los colores a mostrar alrededor de un círculo cuando se selecciona, si mostrar las etiquetas o no, si los círculos deberán mostrarse en espiral o en modo "relacional" (qué elementos se relacionan con qué otros) y poco más.
Como resumen, haría falta documentación, mayor capacidad de personalización y resolver los problemas de usabilidad comentados para poder considerar esta visualización verdaderamente útil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-e67056b0-f05f-472e-a1e9-799c31df6a06') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Cluster Map</strong> muestra información -supuestamente agrupada en clusters según algún criterio- en forma de nube de imágenes. Su configuración es la mostrada en la siguiente imagen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_01.jpg"></a>
Los únicos campos obligatorios son los tres primeros: <em>Cluster ID</em> (identificador de los elementos a mostrar, no de los supuestos clusters -salvo que en esta visualización se denomine cluster a cada uno de los elementos-), <em>Label</em> (etiqueta de cada uno de los elementos a mostrar) y <em>Count</em> (métrica que va a asociarse a los elementos y que va a determinar su ordenación en la visualización).
Supongamos que queremos mostrar los mejores vendedores de nuestra empresa: Arrastremos el campo <em>Employee Id</em> de nuestra tabla de vendedores al campo <em>Cluster ID</em>, el campo <em>Full Name</em> (nombre del vendedor) al campo <em>Label</em>, y la medida <em>Sales</em> (suma de la cifra de ventas en el contexto actual) a <em>Count</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_02.jpg"></a>
Como puede verse, los vendedores con mayor cifra de ventas se representan con círculos de mayor tamaño, permitiendo fácilmente identificar a los mejores. Por otro lado, ni los tamaños ni los radios de los círculos son proporcionales a la cifra en cuestión, lo que puede dificultar su interpretación (afortunadamente se muestra la cifra en el medio del círculo).
Si llevamos al campo <em>Image Url</em> de la visualización el campo <em>Picture</em> de nuestra tabla de vendedores -campo que contiene los URLs con las fotografías de éstos- la visualización se actualizará para mostrar las imágenes en cada círculo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_03.jpg"></a>
Vemos en estas últimas dos imágenes un inconveniente adicional de esta visualización: las etiquetas no se muestran correctamente salvo para aquellos elementos con un valor asociado alto (es decir, para elementos con un círculo de suficiente diámetro). Y mover el cursor encima de uno de los elementos no provoca la aparición de la típica ventana flotante con la información asociada, de forma que nunca sabremos ese "Dani..." que se muestra cerca de la esquina superior derecha de la anterior imagen a qué vendedor se refiere (salvo que solo haya un Daniel, por supuesto). Además, para estos elementos con cifras asociadas pequeñas, la imagen resulta prácticamente invisible, lo que no ayuda en la identificación del elemento en cuestión.
El campo <em>Segmented By</em> se supone que sirve para agrupar los elementos en clusters (o, al menos, para segmentar de alguna forma los elementos), pero el cambio que produce su uso en la visualización es prácticamente imposible de interpretar. Por ejemplo, si llevamos el campo <em>Country</em> de nuestro modelo de datos con el fin de identificar a qué país pertenece cada vendedor, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_04.jpg"></a>
La imagen puede parecer idéntica a la anterior pero, si nos fijamos, vemos que ha aparecido un borde en torno a los círculos que se supone que debería permitirnos distinguir los elementos de un país de los de otro (pero no lo permite demasiado bien, para qué decir otra cosa). Si los colores escogidos para cada segmento fuesen personalizables, todavía... pero no lo son.
Los otros tres campos, <em>Related To</em>, <em>Relatedness Strength</em> y <em>Parent Cluster ID</em> sirven -aparentemente, pues no hay documentación a la que recurrir- para asociar los elementos a otros a los que estén relacionados. Por ejemplo, nuestra tabla de vendedores incluye un campo ("<em>Manager</em>") con el identificador del supervisor de cada vendedor (en el modelo de datos que estamos usando no todos los trabajadores tienen un supervisor). Si llevamos este campo al campo <em>Related To</em> de la visualización, los vendedores que tienen un supervisor en el grupo de mejores vendedores se muestran unidos a éstos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_05.jpg"></a>
En la imagen anterior, los grupos de vendedor-supervisor se muestran en el lateral izquierdo y en la parte superior de la visualización.
Los otros dos campos (<em>Relatedness Strength</em> y <em>Parent Cluster ID</em>) no tienen una utilidad fácilmente interpretable.
Un clic en uno de los elementos lo destaca frente al resto y filtra el resto de visualizaciones del informe.
La visualización es muy poco configurable: apenas los colores a mostrar alrededor de un círculo cuando se selecciona, si mostrar las etiquetas o no, si los círculos deberán mostrarse en espiral o en modo "relacional" (qué elementos se relacionan con qué otros) y poco más.
Como resumen, haría falta documentación, mayor capacidad de personalización y resolver los problemas de usabilidad comentados para poder considerar esta visualización verdaderamente útil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-e67056b0-f05f-472e-a1e9-799c31df6a06') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Cluster Map</strong> muestra información -supuestamente agrupada en clusters según algún criterio- en forma de nube de imágenes. Su configuración es la mostrada en la siguiente imagen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_01.jpg"></a>
Los únicos campos obligatorios son los tres primeros: <em>Cluster ID</em> (identificador de los elementos a mostrar, no de los supuestos clusters -salvo que en esta visualización se denomine cluster a cada uno de los elementos-), <em>Label</em> (etiqueta de cada uno de los elementos a mostrar) y <em>Count</em> (métrica que va a asociarse a los elementos y que va a determinar su ordenación en la visualización).
Supongamos que queremos mostrar los mejores vendedores de nuestra empresa: Arrastremos el campo <em>Employee Id</em> de nuestra tabla de vendedores al campo <em>Cluster ID</em>, el campo <em>Full Name</em> (nombre del vendedor) al campo <em>Label</em>, y la medida <em>Sales</em> (suma de la cifra de ventas en el contexto actual) a <em>Count</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_02.jpg"></a>
Como puede verse, los vendedores con mayor cifra de ventas se representan con círculos de mayor tamaño, permitiendo fácilmente identificar a los mejores. Por otro lado, ni los tamaños ni los radios de los círculos son proporcionales a la cifra en cuestión, lo que puede dificultar su interpretación (afortunadamente se muestra la cifra en el medio del círculo).
Si llevamos al campo <em>Image Url</em> de la visualización el campo <em>Picture</em> de nuestra tabla de vendedores -campo que contiene los URLs con las fotografías de éstos- la visualización se actualizará para mostrar las imágenes en cada círculo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_03.jpg"></a>
Vemos en estas últimas dos imágenes un inconveniente adicional de esta visualización: las etiquetas no se muestran correctamente salvo para aquellos elementos con un valor asociado alto (es decir, para elementos con un círculo de suficiente diámetro). Y mover el cursor encima de uno de los elementos no provoca la aparición de la típica ventana flotante con la información asociada, de forma que nunca sabremos ese "Dani..." que se muestra cerca de la esquina superior derecha de la anterior imagen a qué vendedor se refiere (salvo que solo haya un Daniel, por supuesto). Además, para estos elementos con cifras asociadas pequeñas, la imagen resulta prácticamente invisible, lo que no ayuda en la identificación del elemento en cuestión.
El campo <em>Segmented By</em> se supone que sirve para agrupar los elementos en clusters (o, al menos, para segmentar de alguna forma los elementos), pero el cambio que produce su uso en la visualización es prácticamente imposible de interpretar. Por ejemplo, si llevamos el campo <em>Country</em> de nuestro modelo de datos con el fin de identificar a qué país pertenece cada vendedor, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_04.jpg"></a>
La imagen puede parecer idéntica a la anterior pero, si nos fijamos, vemos que ha aparecido un borde en torno a los círculos que se supone que debería permitirnos distinguir los elementos de un país de los de otro (pero no lo permite demasiado bien, para qué decir otra cosa). Si los colores escogidos para cada segmento fuesen personalizables, todavía... pero no lo son.
Los otros tres campos, <em>Related To</em>, <em>Relatedness Strength</em> y <em>Parent Cluster ID</em> sirven -aparentemente, pues no hay documentación a la que recurrir- para asociar los elementos a otros a los que estén relacionados. Por ejemplo, nuestra tabla de vendedores incluye un campo ("<em>Manager</em>") con el identificador del supervisor de cada vendedor (en el modelo de datos que estamos usando no todos los trabajadores tienen un supervisor). Si llevamos este campo al campo <em>Related To</em> de la visualización, los vendedores que tienen un supervisor en el grupo de mejores vendedores se muestran unidos a éstos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_05.jpg"></a>
En la imagen anterior, los grupos de vendedor-supervisor se muestran en el lateral izquierdo y en la parte superior de la visualización.
Los otros dos campos (<em>Relatedness Strength</em> y <em>Parent Cluster ID</em>) no tienen una utilidad fácilmente interpretable.
Un clic en uno de los elementos lo destaca frente al resto y filtra el resto de visualizaciones del informe.
La visualización es muy poco configurable: apenas los colores a mostrar alrededor de un círculo cuando se selecciona, si mostrar las etiquetas o no, si los círculos deberán mostrarse en espiral o en modo "relacional" (qué elementos se relacionan con qué otros) y poco más.
Como resumen, haría falta documentación, mayor capacidad de personalización y resolver los problemas de usabilidad comentados para poder considerar esta visualización verdaderamente útil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-e67056b0-f05f-472e-a1e9-799c31df6a06') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Cluster Map</strong> muestra información -supuestamente agrupada en clusters según algún criterio- en forma de nube de imágenes. Su configuración es la mostrada en la siguiente imagen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_01.jpg"></a>
Los únicos campos obligatorios son los tres primeros: <em>Cluster ID</em> (identificador de los elementos a mostrar, no de los supuestos clusters -salvo que en esta visualización se denomine cluster a cada uno de los elementos-), <em>Label</em> (etiqueta de cada uno de los elementos a mostrar) y <em>Count</em> (métrica que va a asociarse a los elementos y que va a determinar su ordenación en la visualización).
Supongamos que queremos mostrar los mejores vendedores de nuestra empresa: Arrastremos el campo <em>Employee Id</em> de nuestra tabla de vendedores al campo <em>Cluster ID</em>, el campo <em>Full Name</em> (nombre del vendedor) al campo <em>Label</em>, y la medida <em>Sales</em> (suma de la cifra de ventas en el contexto actual) a <em>Count</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_02.jpg"></a>
Como puede verse, los vendedores con mayor cifra de ventas se representan con círculos de mayor tamaño, permitiendo fácilmente identificar a los mejores. Por otro lado, ni los tamaños ni los radios de los círculos son proporcionales a la cifra en cuestión, lo que puede dificultar su interpretación (afortunadamente se muestra la cifra en el medio del círculo).
Si llevamos al campo <em>Image Url</em> de la visualización el campo <em>Picture</em> de nuestra tabla de vendedores -campo que contiene los URLs con las fotografías de éstos- la visualización se actualizará para mostrar las imágenes en cada círculo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_03.jpg"></a>
Vemos en estas últimas dos imágenes un inconveniente adicional de esta visualización: las etiquetas no se muestran correctamente salvo para aquellos elementos con un valor asociado alto (es decir, para elementos con un círculo de suficiente diámetro). Y mover el cursor encima de uno de los elementos no provoca la aparición de la típica ventana flotante con la información asociada, de forma que nunca sabremos ese "Dani..." que se muestra cerca de la esquina superior derecha de la anterior imagen a qué vendedor se refiere (salvo que solo haya un Daniel, por supuesto). Además, para estos elementos con cifras asociadas pequeñas, la imagen resulta prácticamente invisible, lo que no ayuda en la identificación del elemento en cuestión.
El campo <em>Segmented By</em> se supone que sirve para agrupar los elementos en clusters (o, al menos, para segmentar de alguna forma los elementos), pero el cambio que produce su uso en la visualización es prácticamente imposible de interpretar. Por ejemplo, si llevamos el campo <em>Country</em> de nuestro modelo de datos con el fin de identificar a qué país pertenece cada vendedor, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_04.jpg"></a>
La imagen puede parecer idéntica a la anterior pero, si nos fijamos, vemos que ha aparecido un borde en torno a los círculos que se supone que debería permitirnos distinguir los elementos de un país de los de otro (pero no lo permite demasiado bien, para qué decir otra cosa). Si los colores escogidos para cada segmento fuesen personalizables, todavía... pero no lo son.
Los otros tres campos, <em>Related To</em>, <em>Relatedness Strength</em> y <em>Parent Cluster ID</em> sirven -aparentemente, pues no hay documentación a la que recurrir- para asociar los elementos a otros a los que estén relacionados. Por ejemplo, nuestra tabla de vendedores incluye un campo ("<em>Manager</em>") con el identificador del supervisor de cada vendedor (en el modelo de datos que estamos usando no todos los trabajadores tienen un supervisor). Si llevamos este campo al campo <em>Related To</em> de la visualización, los vendedores que tienen un supervisor en el grupo de mejores vendedores se muestran unidos a éstos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_05.jpg"></a>
En la imagen anterior, los grupos de vendedor-supervisor se muestran en el lateral izquierdo y en la parte superior de la visualización.
Los otros dos campos (<em>Relatedness Strength</em> y <em>Parent Cluster ID</em>) no tienen una utilidad fácilmente interpretable.
Un clic en uno de los elementos lo destaca frente al resto y filtra el resto de visualizaciones del informe.
La visualización es muy poco configurable: apenas los colores a mostrar alrededor de un círculo cuando se selecciona, si mostrar las etiquetas o no, si los círculos deberán mostrarse en espiral o en modo "relacional" (qué elementos se relacionan con qué otros) y poco más.
Como resumen, haría falta documentación, mayor capacidad de personalización y resolver los problemas de usabilidad comentados para poder considerar esta visualización verdaderamente útil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-c870e59e-a509-4cd3-8c6c-7f4b8482e34c') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Cluster Map</strong> muestra información -supuestamente agrupada en clusters según algún criterio- en forma de nube de imágenes. Su configuración es la mostrada en la siguiente imagen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_01.jpg"></a>
Los únicos campos obligatorios son los tres primeros: <em>Cluster ID</em> (identificador de los elementos a mostrar, no de los supuestos clusters -salvo que en esta visualización se denomine cluster a cada uno de los elementos-), <em>Label</em> (etiqueta de cada uno de los elementos a mostrar) y <em>Count</em> (métrica que va a asociarse a los elementos y que va a determinar su ordenación en la visualización).
Supongamos que queremos mostrar los mejores vendedores de nuestra empresa: Arrastremos el campo <em>Employee Id</em> de nuestra tabla de vendedores al campo <em>Cluster ID</em>, el campo <em>Full Name</em> (nombre del vendedor) al campo <em>Label</em>, y la medida <em>Sales</em> (suma de la cifra de ventas en el contexto actual) a <em>Count</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_02.jpg"></a>
Como puede verse, los vendedores con mayor cifra de ventas se representan con círculos de mayor tamaño, permitiendo fácilmente identificar a los mejores. Por otro lado, ni los tamaños ni los radios de los círculos son proporcionales a la cifra en cuestión, lo que puede dificultar su interpretación (afortunadamente se muestra la cifra en el medio del círculo).
Si llevamos al campo <em>Image Url</em> de la visualización el campo <em>Picture</em> de nuestra tabla de vendedores -campo que contiene los URLs con las fotografías de éstos- la visualización se actualizará para mostrar las imágenes en cada círculo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_03.jpg"></a>
Vemos en estas últimas dos imágenes un inconveniente adicional de esta visualización: las etiquetas no se muestran correctamente salvo para aquellos elementos con un valor asociado alto (es decir, para elementos con un círculo de suficiente diámetro). Y mover el cursor encima de uno de los elementos no provoca la aparición de la típica ventana flotante con la información asociada, de forma que nunca sabremos ese "Dani..." que se muestra cerca de la esquina superior derecha de la anterior imagen a qué vendedor se refiere (salvo que solo haya un Daniel, por supuesto). Además, para estos elementos con cifras asociadas pequeñas, la imagen resulta prácticamente invisible, lo que no ayuda en la identificación del elemento en cuestión.
El campo <em>Segmented By</em> se supone que sirve para agrupar los elementos en clusters (o, al menos, para segmentar de alguna forma los elementos), pero el cambio que produce su uso en la visualización es prácticamente imposible de interpretar. Por ejemplo, si llevamos el campo <em>Country</em> de nuestro modelo de datos con el fin de identificar a qué país pertenece cada vendedor, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_04.jpg"></a>
La imagen puede parecer idéntica a la anterior pero, si nos fijamos, vemos que ha aparecido un borde en torno a los círculos que se supone que debería permitirnos distinguir los elementos de un país de los de otro (pero no lo permite demasiado bien, para qué decir otra cosa). Si los colores escogidos para cada segmento fuesen personalizables, todavía... pero no lo son.
Los otros tres campos, <em>Related To</em>, <em>Relatedness Strength</em> y <em>Parent Cluster ID</em> sirven -aparentemente, pues no hay documentación a la que recurrir- para asociar los elementos a otros a los que estén relacionados. Por ejemplo, nuestra tabla de vendedores incluye un campo ("<em>Manager</em>") con el identificador del supervisor de cada vendedor (en el modelo de datos que estamos usando no todos los trabajadores tienen un supervisor). Si llevamos este campo al campo <em>Related To</em> de la visualización, los vendedores que tienen un supervisor en el grupo de mejores vendedores se muestran unidos a éstos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_05.jpg"></a>
En la imagen anterior, los grupos de vendedor-supervisor se muestran en el lateral izquierdo y en la parte superior de la visualización.
Los otros dos campos (<em>Relatedness Strength</em> y <em>Parent Cluster ID</em>) no tienen una utilidad fácilmente interpretable.
Un clic en uno de los elementos lo destaca frente al resto y filtra el resto de visualizaciones del informe.
La visualización es muy poco configurable: apenas los colores a mostrar alrededor de un círculo cuando se selecciona, si mostrar las etiquetas o no, si los círculos deberán mostrarse en espiral o en modo "relacional" (qué elementos se relacionan con qué otros) y poco más.
Como resumen, haría falta documentación, mayor capacidad de personalización y resolver los problemas de usabilidad comentados para poder considerar esta visualización verdaderamente útil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-c870e59e-a509-4cd3-8c6c-7f4b8482e34c') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Cluster Map</strong> muestra información -supuestamente agrupada en clusters según algún criterio- en forma de nube de imágenes. Su configuración es la mostrada en la siguiente imagen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_01.jpg"></a>
Los únicos campos obligatorios son los tres primeros: <em>Cluster ID</em> (identificador de los elementos a mostrar, no de los supuestos clusters -salvo que en esta visualización se denomine cluster a cada uno de los elementos-), <em>Label</em> (etiqueta de cada uno de los elementos a mostrar) y <em>Count</em> (métrica que va a asociarse a los elementos y que va a determinar su ordenación en la visualización).
Supongamos que queremos mostrar los mejores vendedores de nuestra empresa: Arrastremos el campo <em>Employee Id</em> de nuestra tabla de vendedores al campo <em>Cluster ID</em>, el campo <em>Full Name</em> (nombre del vendedor) al campo <em>Label</em>, y la medida <em>Sales</em> (suma de la cifra de ventas en el contexto actual) a <em>Count</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_02.jpg"></a>
Como puede verse, los vendedores con mayor cifra de ventas se representan con círculos de mayor tamaño, permitiendo fácilmente identificar a los mejores. Por otro lado, ni los tamaños ni los radios de los círculos son proporcionales a la cifra en cuestión, lo que puede dificultar su interpretación (afortunadamente se muestra la cifra en el medio del círculo).
Si llevamos al campo <em>Image Url</em> de la visualización el campo <em>Picture</em> de nuestra tabla de vendedores -campo que contiene los URLs con las fotografías de éstos- la visualización se actualizará para mostrar las imágenes en cada círculo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_03.jpg"></a>
Vemos en estas últimas dos imágenes un inconveniente adicional de esta visualización: las etiquetas no se muestran correctamente salvo para aquellos elementos con un valor asociado alto (es decir, para elementos con un círculo de suficiente diámetro). Y mover el cursor encima de uno de los elementos no provoca la aparición de la típica ventana flotante con la información asociada, de forma que nunca sabremos ese "Dani..." que se muestra cerca de la esquina superior derecha de la anterior imagen a qué vendedor se refiere (salvo que solo haya un Daniel, por supuesto). Además, para estos elementos con cifras asociadas pequeñas, la imagen resulta prácticamente invisible, lo que no ayuda en la identificación del elemento en cuestión.
El campo <em>Segmented By</em> se supone que sirve para agrupar los elementos en clusters (o, al menos, para segmentar de alguna forma los elementos), pero el cambio que produce su uso en la visualización es prácticamente imposible de interpretar. Por ejemplo, si llevamos el campo <em>Country</em> de nuestro modelo de datos con el fin de identificar a qué país pertenece cada vendedor, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_04.jpg"></a>
La imagen puede parecer idéntica a la anterior pero, si nos fijamos, vemos que ha aparecido un borde en torno a los círculos que se supone que debería permitirnos distinguir los elementos de un país de los de otro (pero no lo permite demasiado bien, para qué decir otra cosa). Si los colores escogidos para cada segmento fuesen personalizables, todavía... pero no lo son.
Los otros tres campos, <em>Related To</em>, <em>Relatedness Strength</em> y <em>Parent Cluster ID</em> sirven -aparentemente, pues no hay documentación a la que recurrir- para asociar los elementos a otros a los que estén relacionados. Por ejemplo, nuestra tabla de vendedores incluye un campo ("<em>Manager</em>") con el identificador del supervisor de cada vendedor (en el modelo de datos que estamos usando no todos los trabajadores tienen un supervisor). Si llevamos este campo al campo <em>Related To</em> de la visualización, los vendedores que tienen un supervisor en el grupo de mejores vendedores se muestran unidos a éstos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_05.jpg"></a>
En la imagen anterior, los grupos de vendedor-supervisor se muestran en el lateral izquierdo y en la parte superior de la visualización.
Los otros dos campos (<em>Relatedness Strength</em> y <em>Parent Cluster ID</em>) no tienen una utilidad fácilmente interpretable.
Un clic en uno de los elementos lo destaca frente al resto y filtra el resto de visualizaciones del informe.
La visualización es muy poco configurable: apenas los colores a mostrar alrededor de un círculo cuando se selecciona, si mostrar las etiquetas o no, si los círculos deberán mostrarse en espiral o en modo "relacional" (qué elementos se relacionan con qué otros) y poco más.
Como resumen, haría falta documentación, mayor capacidad de personalización y resolver los problemas de usabilidad comentados para poder considerar esta visualización verdaderamente útil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-c870e59e-a509-4cd3-8c6c-7f4b8482e34c') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Cluster Map</strong> muestra información -supuestamente agrupada en clusters según algún criterio- en forma de nube de imágenes. Su configuración es la mostrada en la siguiente imagen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_01.jpg"></a>
Los únicos campos obligatorios son los tres primeros: <em>Cluster ID</em> (identificador de los elementos a mostrar, no de los supuestos clusters -salvo que en esta visualización se denomine cluster a cada uno de los elementos-), <em>Label</em> (etiqueta de cada uno de los elementos a mostrar) y <em>Count</em> (métrica que va a asociarse a los elementos y que va a determinar su ordenación en la visualización).
Supongamos que queremos mostrar los mejores vendedores de nuestra empresa: Arrastremos el campo <em>Employee Id</em> de nuestra tabla de vendedores al campo <em>Cluster ID</em>, el campo <em>Full Name</em> (nombre del vendedor) al campo <em>Label</em>, y la medida <em>Sales</em> (suma de la cifra de ventas en el contexto actual) a <em>Count</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_02.jpg"></a>
Como puede verse, los vendedores con mayor cifra de ventas se representan con círculos de mayor tamaño, permitiendo fácilmente identificar a los mejores. Por otro lado, ni los tamaños ni los radios de los círculos son proporcionales a la cifra en cuestión, lo que puede dificultar su interpretación (afortunadamente se muestra la cifra en el medio del círculo).
Si llevamos al campo <em>Image Url</em> de la visualización el campo <em>Picture</em> de nuestra tabla de vendedores -campo que contiene los URLs con las fotografías de éstos- la visualización se actualizará para mostrar las imágenes en cada círculo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_03.jpg"></a>
Vemos en estas últimas dos imágenes un inconveniente adicional de esta visualización: las etiquetas no se muestran correctamente salvo para aquellos elementos con un valor asociado alto (es decir, para elementos con un círculo de suficiente diámetro). Y mover el cursor encima de uno de los elementos no provoca la aparición de la típica ventana flotante con la información asociada, de forma que nunca sabremos ese "Dani..." que se muestra cerca de la esquina superior derecha de la anterior imagen a qué vendedor se refiere (salvo que solo haya un Daniel, por supuesto). Además, para estos elementos con cifras asociadas pequeñas, la imagen resulta prácticamente invisible, lo que no ayuda en la identificación del elemento en cuestión.
El campo <em>Segmented By</em> se supone que sirve para agrupar los elementos en clusters (o, al menos, para segmentar de alguna forma los elementos), pero el cambio que produce su uso en la visualización es prácticamente imposible de interpretar. Por ejemplo, si llevamos el campo <em>Country</em> de nuestro modelo de datos con el fin de identificar a qué país pertenece cada vendedor, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_04.jpg"></a>
La imagen puede parecer idéntica a la anterior pero, si nos fijamos, vemos que ha aparecido un borde en torno a los círculos que se supone que debería permitirnos distinguir los elementos de un país de los de otro (pero no lo permite demasiado bien, para qué decir otra cosa). Si los colores escogidos para cada segmento fuesen personalizables, todavía... pero no lo son.
Los otros tres campos, <em>Related To</em>, <em>Relatedness Strength</em> y <em>Parent Cluster ID</em> sirven -aparentemente, pues no hay documentación a la que recurrir- para asociar los elementos a otros a los que estén relacionados. Por ejemplo, nuestra tabla de vendedores incluye un campo ("<em>Manager</em>") con el identificador del supervisor de cada vendedor (en el modelo de datos que estamos usando no todos los trabajadores tienen un supervisor). Si llevamos este campo al campo <em>Related To</em> de la visualización, los vendedores que tienen un supervisor en el grupo de mejores vendedores se muestran unidos a éstos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_05.jpg"></a>
En la imagen anterior, los grupos de vendedor-supervisor se muestran en el lateral izquierdo y en la parte superior de la visualización.
Los otros dos campos (<em>Relatedness Strength</em> y <em>Parent Cluster ID</em>) no tienen una utilidad fácilmente interpretable.
Un clic en uno de los elementos lo destaca frente al resto y filtra el resto de visualizaciones del informe.
La visualización es muy poco configurable: apenas los colores a mostrar alrededor de un círculo cuando se selecciona, si mostrar las etiquetas o no, si los círculos deberán mostrarse en espiral o en modo "relacional" (qué elementos se relacionan con qué otros) y poco más.
Como resumen, haría falta documentación, mayor capacidad de personalización y resolver los problemas de usabilidad comentados para poder considerar esta visualización verdaderamente útil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-c870e59e-a509-4cd3-8c6c-7f4b8482e34c') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Cluster Map</strong> muestra información -supuestamente agrupada en clusters según algún criterio- en forma de nube de imágenes. Su configuración es la mostrada en la siguiente imagen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_01.jpg"></a>
Los únicos campos obligatorios son los tres primeros: <em>Cluster ID</em> (identificador de los elementos a mostrar, no de los supuestos clusters -salvo que en esta visualización se denomine cluster a cada uno de los elementos-), <em>Label</em> (etiqueta de cada uno de los elementos a mostrar) y <em>Count</em> (métrica que va a asociarse a los elementos y que va a determinar su ordenación en la visualización).
Supongamos que queremos mostrar los mejores vendedores de nuestra empresa: Arrastremos el campo <em>Employee Id</em> de nuestra tabla de vendedores al campo <em>Cluster ID</em>, el campo <em>Full Name</em> (nombre del vendedor) al campo <em>Label</em>, y la medida <em>Sales</em> (suma de la cifra de ventas en el contexto actual) a <em>Count</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_02.jpg"></a>
Como puede verse, los vendedores con mayor cifra de ventas se representan con círculos de mayor tamaño, permitiendo fácilmente identificar a los mejores. Por otro lado, ni los tamaños ni los radios de los círculos son proporcionales a la cifra en cuestión, lo que puede dificultar su interpretación (afortunadamente se muestra la cifra en el medio del círculo).
Si llevamos al campo <em>Image Url</em> de la visualización el campo <em>Picture</em> de nuestra tabla de vendedores -campo que contiene los URLs con las fotografías de éstos- la visualización se actualizará para mostrar las imágenes en cada círculo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_03.jpg"></a>
Vemos en estas últimas dos imágenes un inconveniente adicional de esta visualización: las etiquetas no se muestran correctamente salvo para aquellos elementos con un valor asociado alto (es decir, para elementos con un círculo de suficiente diámetro). Y mover el cursor encima de uno de los elementos no provoca la aparición de la típica ventana flotante con la información asociada, de forma que nunca sabremos ese "Dani..." que se muestra cerca de la esquina superior derecha de la anterior imagen a qué vendedor se refiere (salvo que solo haya un Daniel, por supuesto). Además, para estos elementos con cifras asociadas pequeñas, la imagen resulta prácticamente invisible, lo que no ayuda en la identificación del elemento en cuestión.
El campo <em>Segmented By</em> se supone que sirve para agrupar los elementos en clusters (o, al menos, para segmentar de alguna forma los elementos), pero el cambio que produce su uso en la visualización es prácticamente imposible de interpretar. Por ejemplo, si llevamos el campo <em>Country</em> de nuestro modelo de datos con el fin de identificar a qué país pertenece cada vendedor, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_04.jpg"></a>
La imagen puede parecer idéntica a la anterior pero, si nos fijamos, vemos que ha aparecido un borde en torno a los círculos que se supone que debería permitirnos distinguir los elementos de un país de los de otro (pero no lo permite demasiado bien, para qué decir otra cosa). Si los colores escogidos para cada segmento fuesen personalizables, todavía... pero no lo son.
Los otros tres campos, <em>Related To</em>, <em>Relatedness Strength</em> y <em>Parent Cluster ID</em> sirven -aparentemente, pues no hay documentación a la que recurrir- para asociar los elementos a otros a los que estén relacionados. Por ejemplo, nuestra tabla de vendedores incluye un campo ("<em>Manager</em>") con el identificador del supervisor de cada vendedor (en el modelo de datos que estamos usando no todos los trabajadores tienen un supervisor). Si llevamos este campo al campo <em>Related To</em> de la visualización, los vendedores que tienen un supervisor en el grupo de mejores vendedores se muestran unidos a éstos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_05.jpg"></a>
En la imagen anterior, los grupos de vendedor-supervisor se muestran en el lateral izquierdo y en la parte superior de la visualización.
Los otros dos campos (<em>Relatedness Strength</em> y <em>Parent Cluster ID</em>) no tienen una utilidad fácilmente interpretable.
Un clic en uno de los elementos lo destaca frente al resto y filtra el resto de visualizaciones del informe.
La visualización es muy poco configurable: apenas los colores a mostrar alrededor de un círculo cuando se selecciona, si mostrar las etiquetas o no, si los círculos deberán mostrarse en espiral o en modo "relacional" (qué elementos se relacionan con qué otros) y poco más.
Como resumen, haría falta documentación, mayor capacidad de personalización y resolver los problemas de usabilidad comentados para poder considerar esta visualización verdaderamente útil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-42fbff66-9ee2-4f1f-8286-834e055808d3') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Cluster Map</strong> muestra información -supuestamente agrupada en clusters según algún criterio- en forma de nube de imágenes. Su configuración es la mostrada en la siguiente imagen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_01.jpg"></a>
Los únicos campos obligatorios son los tres primeros: <em>Cluster ID</em> (identificador de los elementos a mostrar, no de los supuestos clusters -salvo que en esta visualización se denomine cluster a cada uno de los elementos-), <em>Label</em> (etiqueta de cada uno de los elementos a mostrar) y <em>Count</em> (métrica que va a asociarse a los elementos y que va a determinar su ordenación en la visualización).
Supongamos que queremos mostrar los mejores vendedores de nuestra empresa: Arrastremos el campo <em>Employee Id</em> de nuestra tabla de vendedores al campo <em>Cluster ID</em>, el campo <em>Full Name</em> (nombre del vendedor) al campo <em>Label</em>, y la medida <em>Sales</em> (suma de la cifra de ventas en el contexto actual) a <em>Count</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_02.jpg"></a>
Como puede verse, los vendedores con mayor cifra de ventas se representan con círculos de mayor tamaño, permitiendo fácilmente identificar a los mejores. Por otro lado, ni los tamaños ni los radios de los círculos son proporcionales a la cifra en cuestión, lo que puede dificultar su interpretación (afortunadamente se muestra la cifra en el medio del círculo).
Si llevamos al campo <em>Image Url</em> de la visualización el campo <em>Picture</em> de nuestra tabla de vendedores -campo que contiene los URLs con las fotografías de éstos- la visualización se actualizará para mostrar las imágenes en cada círculo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_03.jpg"></a>
Vemos en estas últimas dos imágenes un inconveniente adicional de esta visualización: las etiquetas no se muestran correctamente salvo para aquellos elementos con un valor asociado alto (es decir, para elementos con un círculo de suficiente diámetro). Y mover el cursor encima de uno de los elementos no provoca la aparición de la típica ventana flotante con la información asociada, de forma que nunca sabremos ese "Dani..." que se muestra cerca de la esquina superior derecha de la anterior imagen a qué vendedor se refiere (salvo que solo haya un Daniel, por supuesto). Además, para estos elementos con cifras asociadas pequeñas, la imagen resulta prácticamente invisible, lo que no ayuda en la identificación del elemento en cuestión.
El campo <em>Segmented By</em> se supone que sirve para agrupar los elementos en clusters (o, al menos, para segmentar de alguna forma los elementos), pero el cambio que produce su uso en la visualización es prácticamente imposible de interpretar. Por ejemplo, si llevamos el campo <em>Country</em> de nuestro modelo de datos con el fin de identificar a qué país pertenece cada vendedor, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_04.jpg"></a>
La imagen puede parecer idéntica a la anterior pero, si nos fijamos, vemos que ha aparecido un borde en torno a los círculos que se supone que debería permitirnos distinguir los elementos de un país de los de otro (pero no lo permite demasiado bien, para qué decir otra cosa). Si los colores escogidos para cada segmento fuesen personalizables, todavía... pero no lo son.
Los otros tres campos, <em>Related To</em>, <em>Relatedness Strength</em> y <em>Parent Cluster ID</em> sirven -aparentemente, pues no hay documentación a la que recurrir- para asociar los elementos a otros a los que estén relacionados. Por ejemplo, nuestra tabla de vendedores incluye un campo ("<em>Manager</em>") con el identificador del supervisor de cada vendedor (en el modelo de datos que estamos usando no todos los trabajadores tienen un supervisor). Si llevamos este campo al campo <em>Related To</em> de la visualización, los vendedores que tienen un supervisor en el grupo de mejores vendedores se muestran unidos a éstos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_05.jpg"></a>
En la imagen anterior, los grupos de vendedor-supervisor se muestran en el lateral izquierdo y en la parte superior de la visualización.
Los otros dos campos (<em>Relatedness Strength</em> y <em>Parent Cluster ID</em>) no tienen una utilidad fácilmente interpretable.
Un clic en uno de los elementos lo destaca frente al resto y filtra el resto de visualizaciones del informe.
La visualización es muy poco configurable: apenas los colores a mostrar alrededor de un círculo cuando se selecciona, si mostrar las etiquetas o no, si los círculos deberán mostrarse en espiral o en modo "relacional" (qué elementos se relacionan con qué otros) y poco más.
Como resumen, haría falta documentación, mayor capacidad de personalización y resolver los problemas de usabilidad comentados para poder considerar esta visualización verdaderamente útil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-42fbff66-9ee2-4f1f-8286-834e055808d3') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Cluster Map</strong> muestra información -supuestamente agrupada en clusters según algún criterio- en forma de nube de imágenes. Su configuración es la mostrada en la siguiente imagen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_01.jpg"></a>
Los únicos campos obligatorios son los tres primeros: <em>Cluster ID</em> (identificador de los elementos a mostrar, no de los supuestos clusters -salvo que en esta visualización se denomine cluster a cada uno de los elementos-), <em>Label</em> (etiqueta de cada uno de los elementos a mostrar) y <em>Count</em> (métrica que va a asociarse a los elementos y que va a determinar su ordenación en la visualización).
Supongamos que queremos mostrar los mejores vendedores de nuestra empresa: Arrastremos el campo <em>Employee Id</em> de nuestra tabla de vendedores al campo <em>Cluster ID</em>, el campo <em>Full Name</em> (nombre del vendedor) al campo <em>Label</em>, y la medida <em>Sales</em> (suma de la cifra de ventas en el contexto actual) a <em>Count</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_02.jpg"></a>
Como puede verse, los vendedores con mayor cifra de ventas se representan con círculos de mayor tamaño, permitiendo fácilmente identificar a los mejores. Por otro lado, ni los tamaños ni los radios de los círculos son proporcionales a la cifra en cuestión, lo que puede dificultar su interpretación (afortunadamente se muestra la cifra en el medio del círculo).
Si llevamos al campo <em>Image Url</em> de la visualización el campo <em>Picture</em> de nuestra tabla de vendedores -campo que contiene los URLs con las fotografías de éstos- la visualización se actualizará para mostrar las imágenes en cada círculo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_03.jpg"></a>
Vemos en estas últimas dos imágenes un inconveniente adicional de esta visualización: las etiquetas no se muestran correctamente salvo para aquellos elementos con un valor asociado alto (es decir, para elementos con un círculo de suficiente diámetro). Y mover el cursor encima de uno de los elementos no provoca la aparición de la típica ventana flotante con la información asociada, de forma que nunca sabremos ese "Dani..." que se muestra cerca de la esquina superior derecha de la anterior imagen a qué vendedor se refiere (salvo que solo haya un Daniel, por supuesto). Además, para estos elementos con cifras asociadas pequeñas, la imagen resulta prácticamente invisible, lo que no ayuda en la identificación del elemento en cuestión.
El campo <em>Segmented By</em> se supone que sirve para agrupar los elementos en clusters (o, al menos, para segmentar de alguna forma los elementos), pero el cambio que produce su uso en la visualización es prácticamente imposible de interpretar. Por ejemplo, si llevamos el campo <em>Country</em> de nuestro modelo de datos con el fin de identificar a qué país pertenece cada vendedor, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_04.jpg"></a>
La imagen puede parecer idéntica a la anterior pero, si nos fijamos, vemos que ha aparecido un borde en torno a los círculos que se supone que debería permitirnos distinguir los elementos de un país de los de otro (pero no lo permite demasiado bien, para qué decir otra cosa). Si los colores escogidos para cada segmento fuesen personalizables, todavía... pero no lo son.
Los otros tres campos, <em>Related To</em>, <em>Relatedness Strength</em> y <em>Parent Cluster ID</em> sirven -aparentemente, pues no hay documentación a la que recurrir- para asociar los elementos a otros a los que estén relacionados. Por ejemplo, nuestra tabla de vendedores incluye un campo ("<em>Manager</em>") con el identificador del supervisor de cada vendedor (en el modelo de datos que estamos usando no todos los trabajadores tienen un supervisor). Si llevamos este campo al campo <em>Related To</em> de la visualización, los vendedores que tienen un supervisor en el grupo de mejores vendedores se muestran unidos a éstos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_05.jpg"></a>
En la imagen anterior, los grupos de vendedor-supervisor se muestran en el lateral izquierdo y en la parte superior de la visualización.
Los otros dos campos (<em>Relatedness Strength</em> y <em>Parent Cluster ID</em>) no tienen una utilidad fácilmente interpretable.
Un clic en uno de los elementos lo destaca frente al resto y filtra el resto de visualizaciones del informe.
La visualización es muy poco configurable: apenas los colores a mostrar alrededor de un círculo cuando se selecciona, si mostrar las etiquetas o no, si los círculos deberán mostrarse en espiral o en modo "relacional" (qué elementos se relacionan con qué otros) y poco más.
Como resumen, haría falta documentación, mayor capacidad de personalización y resolver los problemas de usabilidad comentados para poder considerar esta visualización verdaderamente útil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-42fbff66-9ee2-4f1f-8286-834e055808d3') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Cluster Map</strong> muestra información -supuestamente agrupada en clusters según algún criterio- en forma de nube de imágenes. Su configuración es la mostrada en la siguiente imagen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_01.jpg"></a>
Los únicos campos obligatorios son los tres primeros: <em>Cluster ID</em> (identificador de los elementos a mostrar, no de los supuestos clusters -salvo que en esta visualización se denomine cluster a cada uno de los elementos-), <em>Label</em> (etiqueta de cada uno de los elementos a mostrar) y <em>Count</em> (métrica que va a asociarse a los elementos y que va a determinar su ordenación en la visualización).
Supongamos que queremos mostrar los mejores vendedores de nuestra empresa: Arrastremos el campo <em>Employee Id</em> de nuestra tabla de vendedores al campo <em>Cluster ID</em>, el campo <em>Full Name</em> (nombre del vendedor) al campo <em>Label</em>, y la medida <em>Sales</em> (suma de la cifra de ventas en el contexto actual) a <em>Count</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_02.jpg"></a>
Como puede verse, los vendedores con mayor cifra de ventas se representan con círculos de mayor tamaño, permitiendo fácilmente identificar a los mejores. Por otro lado, ni los tamaños ni los radios de los círculos son proporcionales a la cifra en cuestión, lo que puede dificultar su interpretación (afortunadamente se muestra la cifra en el medio del círculo).
Si llevamos al campo <em>Image Url</em> de la visualización el campo <em>Picture</em> de nuestra tabla de vendedores -campo que contiene los URLs con las fotografías de éstos- la visualización se actualizará para mostrar las imágenes en cada círculo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_03.jpg"></a>
Vemos en estas últimas dos imágenes un inconveniente adicional de esta visualización: las etiquetas no se muestran correctamente salvo para aquellos elementos con un valor asociado alto (es decir, para elementos con un círculo de suficiente diámetro). Y mover el cursor encima de uno de los elementos no provoca la aparición de la típica ventana flotante con la información asociada, de forma que nunca sabremos ese "Dani..." que se muestra cerca de la esquina superior derecha de la anterior imagen a qué vendedor se refiere (salvo que solo haya un Daniel, por supuesto). Además, para estos elementos con cifras asociadas pequeñas, la imagen resulta prácticamente invisible, lo que no ayuda en la identificación del elemento en cuestión.
El campo <em>Segmented By</em> se supone que sirve para agrupar los elementos en clusters (o, al menos, para segmentar de alguna forma los elementos), pero el cambio que produce su uso en la visualización es prácticamente imposible de interpretar. Por ejemplo, si llevamos el campo <em>Country</em> de nuestro modelo de datos con el fin de identificar a qué país pertenece cada vendedor, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_04.jpg"></a>
La imagen puede parecer idéntica a la anterior pero, si nos fijamos, vemos que ha aparecido un borde en torno a los círculos que se supone que debería permitirnos distinguir los elementos de un país de los de otro (pero no lo permite demasiado bien, para qué decir otra cosa). Si los colores escogidos para cada segmento fuesen personalizables, todavía... pero no lo son.
Los otros tres campos, <em>Related To</em>, <em>Relatedness Strength</em> y <em>Parent Cluster ID</em> sirven -aparentemente, pues no hay documentación a la que recurrir- para asociar los elementos a otros a los que estén relacionados. Por ejemplo, nuestra tabla de vendedores incluye un campo ("<em>Manager</em>") con el identificador del supervisor de cada vendedor (en el modelo de datos que estamos usando no todos los trabajadores tienen un supervisor). Si llevamos este campo al campo <em>Related To</em> de la visualización, los vendedores que tienen un supervisor en el grupo de mejores vendedores se muestran unidos a éstos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_05.jpg"></a>
En la imagen anterior, los grupos de vendedor-supervisor se muestran en el lateral izquierdo y en la parte superior de la visualización.
Los otros dos campos (<em>Relatedness Strength</em> y <em>Parent Cluster ID</em>) no tienen una utilidad fácilmente interpretable.
Un clic en uno de los elementos lo destaca frente al resto y filtra el resto de visualizaciones del informe.
La visualización es muy poco configurable: apenas los colores a mostrar alrededor de un círculo cuando se selecciona, si mostrar las etiquetas o no, si los círculos deberán mostrarse en espiral o en modo "relacional" (qué elementos se relacionan con qué otros) y poco más.
Como resumen, haría falta documentación, mayor capacidad de personalización y resolver los problemas de usabilidad comentados para poder considerar esta visualización verdaderamente útil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-42fbff66-9ee2-4f1f-8286-834e055808d3') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Cluster Map</strong> muestra información -supuestamente agrupada en clusters según algún criterio- en forma de nube de imágenes. Su configuración es la mostrada en la siguiente imagen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_01.jpg"></a>
Los únicos campos obligatorios son los tres primeros: <em>Cluster ID</em> (identificador de los elementos a mostrar, no de los supuestos clusters -salvo que en esta visualización se denomine cluster a cada uno de los elementos-), <em>Label</em> (etiqueta de cada uno de los elementos a mostrar) y <em>Count</em> (métrica que va a asociarse a los elementos y que va a determinar su ordenación en la visualización).
Supongamos que queremos mostrar los mejores vendedores de nuestra empresa: Arrastremos el campo <em>Employee Id</em> de nuestra tabla de vendedores al campo <em>Cluster ID</em>, el campo <em>Full Name</em> (nombre del vendedor) al campo <em>Label</em>, y la medida <em>Sales</em> (suma de la cifra de ventas en el contexto actual) a <em>Count</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_02.jpg"></a>
Como puede verse, los vendedores con mayor cifra de ventas se representan con círculos de mayor tamaño, permitiendo fácilmente identificar a los mejores. Por otro lado, ni los tamaños ni los radios de los círculos son proporcionales a la cifra en cuestión, lo que puede dificultar su interpretación (afortunadamente se muestra la cifra en el medio del círculo).
Si llevamos al campo <em>Image Url</em> de la visualización el campo <em>Picture</em> de nuestra tabla de vendedores -campo que contiene los URLs con las fotografías de éstos- la visualización se actualizará para mostrar las imágenes en cada círculo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_03.jpg"></a>
Vemos en estas últimas dos imágenes un inconveniente adicional de esta visualización: las etiquetas no se muestran correctamente salvo para aquellos elementos con un valor asociado alto (es decir, para elementos con un círculo de suficiente diámetro). Y mover el cursor encima de uno de los elementos no provoca la aparición de la típica ventana flotante con la información asociada, de forma que nunca sabremos ese "Dani..." que se muestra cerca de la esquina superior derecha de la anterior imagen a qué vendedor se refiere (salvo que solo haya un Daniel, por supuesto). Además, para estos elementos con cifras asociadas pequeñas, la imagen resulta prácticamente invisible, lo que no ayuda en la identificación del elemento en cuestión.
El campo <em>Segmented By</em> se supone que sirve para agrupar los elementos en clusters (o, al menos, para segmentar de alguna forma los elementos), pero el cambio que produce su uso en la visualización es prácticamente imposible de interpretar. Por ejemplo, si llevamos el campo <em>Country</em> de nuestro modelo de datos con el fin de identificar a qué país pertenece cada vendedor, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_04.jpg"></a>
La imagen puede parecer idéntica a la anterior pero, si nos fijamos, vemos que ha aparecido un borde en torno a los círculos que se supone que debería permitirnos distinguir los elementos de un país de los de otro (pero no lo permite demasiado bien, para qué decir otra cosa). Si los colores escogidos para cada segmento fuesen personalizables, todavía... pero no lo son.
Los otros tres campos, <em>Related To</em>, <em>Relatedness Strength</em> y <em>Parent Cluster ID</em> sirven -aparentemente, pues no hay documentación a la que recurrir- para asociar los elementos a otros a los que estén relacionados. Por ejemplo, nuestra tabla de vendedores incluye un campo ("<em>Manager</em>") con el identificador del supervisor de cada vendedor (en el modelo de datos que estamos usando no todos los trabajadores tienen un supervisor). Si llevamos este campo al campo <em>Related To</em> de la visualización, los vendedores que tienen un supervisor en el grupo de mejores vendedores se muestran unidos a éstos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_05.jpg"></a>
En la imagen anterior, los grupos de vendedor-supervisor se muestran en el lateral izquierdo y en la parte superior de la visualización.
Los otros dos campos (<em>Relatedness Strength</em> y <em>Parent Cluster ID</em>) no tienen una utilidad fácilmente interpretable.
Un clic en uno de los elementos lo destaca frente al resto y filtra el resto de visualizaciones del informe.
La visualización es muy poco configurable: apenas los colores a mostrar alrededor de un círculo cuando se selecciona, si mostrar las etiquetas o no, si los círculos deberán mostrarse en espiral o en modo "relacional" (qué elementos se relacionan con qué otros) y poco más.
Como resumen, haría falta documentación, mayor capacidad de personalización y resolver los problemas de usabilidad comentados para poder considerar esta visualización verdaderamente útil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-58c51a83-17d7-47f1-a2d2-dfc0206f8b7d') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Cluster Map</strong> muestra información -supuestamente agrupada en clusters según algún criterio- en forma de nube de imágenes. Su configuración es la mostrada en la siguiente imagen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_01.jpg"></a>
Los únicos campos obligatorios son los tres primeros: <em>Cluster ID</em> (identificador de los elementos a mostrar, no de los supuestos clusters -salvo que en esta visualización se denomine cluster a cada uno de los elementos-), <em>Label</em> (etiqueta de cada uno de los elementos a mostrar) y <em>Count</em> (métrica que va a asociarse a los elementos y que va a determinar su ordenación en la visualización).
Supongamos que queremos mostrar los mejores vendedores de nuestra empresa: Arrastremos el campo <em>Employee Id</em> de nuestra tabla de vendedores al campo <em>Cluster ID</em>, el campo <em>Full Name</em> (nombre del vendedor) al campo <em>Label</em>, y la medida <em>Sales</em> (suma de la cifra de ventas en el contexto actual) a <em>Count</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_02.jpg"></a>
Como puede verse, los vendedores con mayor cifra de ventas se representan con círculos de mayor tamaño, permitiendo fácilmente identificar a los mejores. Por otro lado, ni los tamaños ni los radios de los círculos son proporcionales a la cifra en cuestión, lo que puede dificultar su interpretación (afortunadamente se muestra la cifra en el medio del círculo).
Si llevamos al campo <em>Image Url</em> de la visualización el campo <em>Picture</em> de nuestra tabla de vendedores -campo que contiene los URLs con las fotografías de éstos- la visualización se actualizará para mostrar las imágenes en cada círculo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_03.jpg"></a>
Vemos en estas últimas dos imágenes un inconveniente adicional de esta visualización: las etiquetas no se muestran correctamente salvo para aquellos elementos con un valor asociado alto (es decir, para elementos con un círculo de suficiente diámetro). Y mover el cursor encima de uno de los elementos no provoca la aparición de la típica ventana flotante con la información asociada, de forma que nunca sabremos ese "Dani..." que se muestra cerca de la esquina superior derecha de la anterior imagen a qué vendedor se refiere (salvo que solo haya un Daniel, por supuesto). Además, para estos elementos con cifras asociadas pequeñas, la imagen resulta prácticamente invisible, lo que no ayuda en la identificación del elemento en cuestión.
El campo <em>Segmented By</em> se supone que sirve para agrupar los elementos en clusters (o, al menos, para segmentar de alguna forma los elementos), pero el cambio que produce su uso en la visualización es prácticamente imposible de interpretar. Por ejemplo, si llevamos el campo <em>Country</em> de nuestro modelo de datos con el fin de identificar a qué país pertenece cada vendedor, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_04.jpg"></a>
La imagen puede parecer idéntica a la anterior pero, si nos fijamos, vemos que ha aparecido un borde en torno a los círculos que se supone que debería permitirnos distinguir los elementos de un país de los de otro (pero no lo permite demasiado bien, para qué decir otra cosa). Si los colores escogidos para cada segmento fuesen personalizables, todavía... pero no lo son.
Los otros tres campos, <em>Related To</em>, <em>Relatedness Strength</em> y <em>Parent Cluster ID</em> sirven -aparentemente, pues no hay documentación a la que recurrir- para asociar los elementos a otros a los que estén relacionados. Por ejemplo, nuestra tabla de vendedores incluye un campo ("<em>Manager</em>") con el identificador del supervisor de cada vendedor (en el modelo de datos que estamos usando no todos los trabajadores tienen un supervisor). Si llevamos este campo al campo <em>Related To</em> de la visualización, los vendedores que tienen un supervisor en el grupo de mejores vendedores se muestran unidos a éstos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_05.jpg"></a>
En la imagen anterior, los grupos de vendedor-supervisor se muestran en el lateral izquierdo y en la parte superior de la visualización.
Los otros dos campos (<em>Relatedness Strength</em> y <em>Parent Cluster ID</em>) no tienen una utilidad fácilmente interpretable.
Un clic en uno de los elementos lo destaca frente al resto y filtra el resto de visualizaciones del informe.
La visualización es muy poco configurable: apenas los colores a mostrar alrededor de un círculo cuando se selecciona, si mostrar las etiquetas o no, si los círculos deberán mostrarse en espiral o en modo "relacional" (qué elementos se relacionan con qué otros) y poco más.
Como resumen, haría falta documentación, mayor capacidad de personalización y resolver los problemas de usabilidad comentados para poder considerar esta visualización verdaderamente útil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-58c51a83-17d7-47f1-a2d2-dfc0206f8b7d') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Cluster Map</strong> muestra información -supuestamente agrupada en clusters según algún criterio- en forma de nube de imágenes. Su configuración es la mostrada en la siguiente imagen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_01.jpg"></a>
Los únicos campos obligatorios son los tres primeros: <em>Cluster ID</em> (identificador de los elementos a mostrar, no de los supuestos clusters -salvo que en esta visualización se denomine cluster a cada uno de los elementos-), <em>Label</em> (etiqueta de cada uno de los elementos a mostrar) y <em>Count</em> (métrica que va a asociarse a los elementos y que va a determinar su ordenación en la visualización).
Supongamos que queremos mostrar los mejores vendedores de nuestra empresa: Arrastremos el campo <em>Employee Id</em> de nuestra tabla de vendedores al campo <em>Cluster ID</em>, el campo <em>Full Name</em> (nombre del vendedor) al campo <em>Label</em>, y la medida <em>Sales</em> (suma de la cifra de ventas en el contexto actual) a <em>Count</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_02.jpg"></a>
Como puede verse, los vendedores con mayor cifra de ventas se representan con círculos de mayor tamaño, permitiendo fácilmente identificar a los mejores. Por otro lado, ni los tamaños ni los radios de los círculos son proporcionales a la cifra en cuestión, lo que puede dificultar su interpretación (afortunadamente se muestra la cifra en el medio del círculo).
Si llevamos al campo <em>Image Url</em> de la visualización el campo <em>Picture</em> de nuestra tabla de vendedores -campo que contiene los URLs con las fotografías de éstos- la visualización se actualizará para mostrar las imágenes en cada círculo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_03.jpg"></a>
Vemos en estas últimas dos imágenes un inconveniente adicional de esta visualización: las etiquetas no se muestran correctamente salvo para aquellos elementos con un valor asociado alto (es decir, para elementos con un círculo de suficiente diámetro). Y mover el cursor encima de uno de los elementos no provoca la aparición de la típica ventana flotante con la información asociada, de forma que nunca sabremos ese "Dani..." que se muestra cerca de la esquina superior derecha de la anterior imagen a qué vendedor se refiere (salvo que solo haya un Daniel, por supuesto). Además, para estos elementos con cifras asociadas pequeñas, la imagen resulta prácticamente invisible, lo que no ayuda en la identificación del elemento en cuestión.
El campo <em>Segmented By</em> se supone que sirve para agrupar los elementos en clusters (o, al menos, para segmentar de alguna forma los elementos), pero el cambio que produce su uso en la visualización es prácticamente imposible de interpretar. Por ejemplo, si llevamos el campo <em>Country</em> de nuestro modelo de datos con el fin de identificar a qué país pertenece cada vendedor, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_04.jpg"></a>
La imagen puede parecer idéntica a la anterior pero, si nos fijamos, vemos que ha aparecido un borde en torno a los círculos que se supone que debería permitirnos distinguir los elementos de un país de los de otro (pero no lo permite demasiado bien, para qué decir otra cosa). Si los colores escogidos para cada segmento fuesen personalizables, todavía... pero no lo son.
Los otros tres campos, <em>Related To</em>, <em>Relatedness Strength</em> y <em>Parent Cluster ID</em> sirven -aparentemente, pues no hay documentación a la que recurrir- para asociar los elementos a otros a los que estén relacionados. Por ejemplo, nuestra tabla de vendedores incluye un campo ("<em>Manager</em>") con el identificador del supervisor de cada vendedor (en el modelo de datos que estamos usando no todos los trabajadores tienen un supervisor). Si llevamos este campo al campo <em>Related To</em> de la visualización, los vendedores que tienen un supervisor en el grupo de mejores vendedores se muestran unidos a éstos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_05.jpg"></a>
En la imagen anterior, los grupos de vendedor-supervisor se muestran en el lateral izquierdo y en la parte superior de la visualización.
Los otros dos campos (<em>Relatedness Strength</em> y <em>Parent Cluster ID</em>) no tienen una utilidad fácilmente interpretable.
Un clic en uno de los elementos lo destaca frente al resto y filtra el resto de visualizaciones del informe.
La visualización es muy poco configurable: apenas los colores a mostrar alrededor de un círculo cuando se selecciona, si mostrar las etiquetas o no, si los círculos deberán mostrarse en espiral o en modo "relacional" (qué elementos se relacionan con qué otros) y poco más.
Como resumen, haría falta documentación, mayor capacidad de personalización y resolver los problemas de usabilidad comentados para poder considerar esta visualización verdaderamente útil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-58c51a83-17d7-47f1-a2d2-dfc0206f8b7d') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Cluster Map</strong> muestra información -supuestamente agrupada en clusters según algún criterio- en forma de nube de imágenes. Su configuración es la mostrada en la siguiente imagen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_01.jpg"></a>
Los únicos campos obligatorios son los tres primeros: <em>Cluster ID</em> (identificador de los elementos a mostrar, no de los supuestos clusters -salvo que en esta visualización se denomine cluster a cada uno de los elementos-), <em>Label</em> (etiqueta de cada uno de los elementos a mostrar) y <em>Count</em> (métrica que va a asociarse a los elementos y que va a determinar su ordenación en la visualización).
Supongamos que queremos mostrar los mejores vendedores de nuestra empresa: Arrastremos el campo <em>Employee Id</em> de nuestra tabla de vendedores al campo <em>Cluster ID</em>, el campo <em>Full Name</em> (nombre del vendedor) al campo <em>Label</em>, y la medida <em>Sales</em> (suma de la cifra de ventas en el contexto actual) a <em>Count</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_02.jpg"></a>
Como puede verse, los vendedores con mayor cifra de ventas se representan con círculos de mayor tamaño, permitiendo fácilmente identificar a los mejores. Por otro lado, ni los tamaños ni los radios de los círculos son proporcionales a la cifra en cuestión, lo que puede dificultar su interpretación (afortunadamente se muestra la cifra en el medio del círculo).
Si llevamos al campo <em>Image Url</em> de la visualización el campo <em>Picture</em> de nuestra tabla de vendedores -campo que contiene los URLs con las fotografías de éstos- la visualización se actualizará para mostrar las imágenes en cada círculo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_03.jpg"></a>
Vemos en estas últimas dos imágenes un inconveniente adicional de esta visualización: las etiquetas no se muestran correctamente salvo para aquellos elementos con un valor asociado alto (es decir, para elementos con un círculo de suficiente diámetro). Y mover el cursor encima de uno de los elementos no provoca la aparición de la típica ventana flotante con la información asociada, de forma que nunca sabremos ese "Dani..." que se muestra cerca de la esquina superior derecha de la anterior imagen a qué vendedor se refiere (salvo que solo haya un Daniel, por supuesto). Además, para estos elementos con cifras asociadas pequeñas, la imagen resulta prácticamente invisible, lo que no ayuda en la identificación del elemento en cuestión.
El campo <em>Segmented By</em> se supone que sirve para agrupar los elementos en clusters (o, al menos, para segmentar de alguna forma los elementos), pero el cambio que produce su uso en la visualización es prácticamente imposible de interpretar. Por ejemplo, si llevamos el campo <em>Country</em> de nuestro modelo de datos con el fin de identificar a qué país pertenece cada vendedor, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_04.jpg"></a>
La imagen puede parecer idéntica a la anterior pero, si nos fijamos, vemos que ha aparecido un borde en torno a los círculos que se supone que debería permitirnos distinguir los elementos de un país de los de otro (pero no lo permite demasiado bien, para qué decir otra cosa). Si los colores escogidos para cada segmento fuesen personalizables, todavía... pero no lo son.
Los otros tres campos, <em>Related To</em>, <em>Relatedness Strength</em> y <em>Parent Cluster ID</em> sirven -aparentemente, pues no hay documentación a la que recurrir- para asociar los elementos a otros a los que estén relacionados. Por ejemplo, nuestra tabla de vendedores incluye un campo ("<em>Manager</em>") con el identificador del supervisor de cada vendedor (en el modelo de datos que estamos usando no todos los trabajadores tienen un supervisor). Si llevamos este campo al campo <em>Related To</em> de la visualización, los vendedores que tienen un supervisor en el grupo de mejores vendedores se muestran unidos a éstos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_05.jpg"></a>
En la imagen anterior, los grupos de vendedor-supervisor se muestran en el lateral izquierdo y en la parte superior de la visualización.
Los otros dos campos (<em>Relatedness Strength</em> y <em>Parent Cluster ID</em>) no tienen una utilidad fácilmente interpretable.
Un clic en uno de los elementos lo destaca frente al resto y filtra el resto de visualizaciones del informe.
La visualización es muy poco configurable: apenas los colores a mostrar alrededor de un círculo cuando se selecciona, si mostrar las etiquetas o no, si los círculos deberán mostrarse en espiral o en modo "relacional" (qué elementos se relacionan con qué otros) y poco más.
Como resumen, haría falta documentación, mayor capacidad de personalización y resolver los problemas de usabilidad comentados para poder considerar esta visualización verdaderamente útil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-58c51a83-17d7-47f1-a2d2-dfc0206f8b7d') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Cluster Map</strong> muestra información -supuestamente agrupada en clusters según algún criterio- en forma de nube de imágenes. Su configuración es la mostrada en la siguiente imagen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_01.jpg"></a>
Los únicos campos obligatorios son los tres primeros: <em>Cluster ID</em> (identificador de los elementos a mostrar, no de los supuestos clusters -salvo que en esta visualización se denomine cluster a cada uno de los elementos-), <em>Label</em> (etiqueta de cada uno de los elementos a mostrar) y <em>Count</em> (métrica que va a asociarse a los elementos y que va a determinar su ordenación en la visualización).
Supongamos que queremos mostrar los mejores vendedores de nuestra empresa: Arrastremos el campo <em>Employee Id</em> de nuestra tabla de vendedores al campo <em>Cluster ID</em>, el campo <em>Full Name</em> (nombre del vendedor) al campo <em>Label</em>, y la medida <em>Sales</em> (suma de la cifra de ventas en el contexto actual) a <em>Count</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_02.jpg"></a>
Como puede verse, los vendedores con mayor cifra de ventas se representan con círculos de mayor tamaño, permitiendo fácilmente identificar a los mejores. Por otro lado, ni los tamaños ni los radios de los círculos son proporcionales a la cifra en cuestión, lo que puede dificultar su interpretación (afortunadamente se muestra la cifra en el medio del círculo).
Si llevamos al campo <em>Image Url</em> de la visualización el campo <em>Picture</em> de nuestra tabla de vendedores -campo que contiene los URLs con las fotografías de éstos- la visualización se actualizará para mostrar las imágenes en cada círculo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_03.jpg"></a>
Vemos en estas últimas dos imágenes un inconveniente adicional de esta visualización: las etiquetas no se muestran correctamente salvo para aquellos elementos con un valor asociado alto (es decir, para elementos con un círculo de suficiente diámetro). Y mover el cursor encima de uno de los elementos no provoca la aparición de la típica ventana flotante con la información asociada, de forma que nunca sabremos ese "Dani..." que se muestra cerca de la esquina superior derecha de la anterior imagen a qué vendedor se refiere (salvo que solo haya un Daniel, por supuesto). Además, para estos elementos con cifras asociadas pequeñas, la imagen resulta prácticamente invisible, lo que no ayuda en la identificación del elemento en cuestión.
El campo <em>Segmented By</em> se supone que sirve para agrupar los elementos en clusters (o, al menos, para segmentar de alguna forma los elementos), pero el cambio que produce su uso en la visualización es prácticamente imposible de interpretar. Por ejemplo, si llevamos el campo <em>Country</em> de nuestro modelo de datos con el fin de identificar a qué país pertenece cada vendedor, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_04.jpg"></a>
La imagen puede parecer idéntica a la anterior pero, si nos fijamos, vemos que ha aparecido un borde en torno a los círculos que se supone que debería permitirnos distinguir los elementos de un país de los de otro (pero no lo permite demasiado bien, para qué decir otra cosa). Si los colores escogidos para cada segmento fuesen personalizables, todavía... pero no lo son.
Los otros tres campos, <em>Related To</em>, <em>Relatedness Strength</em> y <em>Parent Cluster ID</em> sirven -aparentemente, pues no hay documentación a la que recurrir- para asociar los elementos a otros a los que estén relacionados. Por ejemplo, nuestra tabla de vendedores incluye un campo ("<em>Manager</em>") con el identificador del supervisor de cada vendedor (en el modelo de datos que estamos usando no todos los trabajadores tienen un supervisor). Si llevamos este campo al campo <em>Related To</em> de la visualización, los vendedores que tienen un supervisor en el grupo de mejores vendedores se muestran unidos a éstos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/power_kpi_matrix_05.jpg"></a>
En la imagen anterior, los grupos de vendedor-supervisor se muestran en el lateral izquierdo y en la parte superior de la visualización.
Los otros dos campos (<em>Relatedness Strength</em> y <em>Parent Cluster ID</em>) no tienen una utilidad fácilmente interpretable.
Un clic en uno de los elementos lo destaca frente al resto y filtra el resto de visualizaciones del informe.
La visualización es muy poco configurable: apenas los colores a mostrar alrededor de un círculo cuando se selecciona, si mostrar las etiquetas o no, si los círculos deberán mostrarse en espiral o en modo "relacional" (qué elementos se relacionan con qué otros) y poco más.
Como resumen, haría falta documentación, mayor capacidad de personalización y resolver los problemas de usabilidad comentados para poder considerar esta visualización verdaderamente útil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '989b4cd6-dcc3-4346-8608-9b230bc33a60') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Multi KPI</strong> de Microsoft permite presentar un KPI (indicador clave de rendimiento) junto a información adicional que puede resultar de interés.
Una vez instanciada en nuestro lienzo, podemos ver qué campos definen su configuración:
Comencemos llevando el campo <em>Date</em> del calendario de nuestro modelo de datos al campo <em>Date</em> de la visualización. Al campo <em>Values</em> deberemos llevar la métrica cuya evolución en el tiempo queremos analizar. Si se trata de una medida discreta, como el total de ventas por día, la gráfica resultante va a ser poco informativa:
Es por ello que resulta más interesante representar métricas como acumulados en el tiempo, o valores medios, etc. Si definimos, por ejemplo, la medida siguiente para calcular el acumulado de ventas:
Sales running total in Date =
CALCULATE(
[Sales];
FILTER(
ALLSELECTED('Calendar'[Date]);
ISONORAFTER('Calendar'[Date]; MAX('Calendar'[Date]); DESC)
)
)
...y la llevamos a nuestra visualización, el resultado es mucho más útil:
En la visualización se muestra el valor actual de la métrica (3 millones de euros), el incremento que esta cifra representa respecto al dato del primer día (354.33K%) y el número de días representados (1.825).
Moviendo el cursor por encima de la gráfica podemos ver, para la fecha correspondiente, cuál era el valor de la métrica:
En la imagen vemos que el sábado 4 de marzo de 2017 las ventas acumuladas eran de 1M€. Podemos cambiar el formato de los valores (para que se muestren en miles, por ejemplo) en <em>Formato > Values Display Units</em>, aunque esto puede obligarnos a modificar el tamaño de la fuente a usar con los valores. Para la gráfica principal podemos cambiar el tamaño de la fuente del valor representado desactivando la opción <em>Formato > KPI > Auto Font Size</em>, y fijando el tamaño que nos interese en <em>Formato > KPI > Value Font Size</em>. Por supuesto podemos configurar muchas otras características de la fuente. Los tamaños a usar cuando estemos moviendo el cursor por encima de la gráfica son configurables por separado, en <em>Formato > KPI On Hover</em>.
Si llevamos al campo <em>Values</em> de la visualización más de un campo de nuestro modelo de datos, se muestran pequeñas gráficas (<em>sparklines</em>) para éstos -completamente configurables- en la parte inferior de la visualización. Así, si llevamos los campos <em>Units</em> (número de unidades vendidas), <em>Sales</em> (cifra de ventas) y <em>Margin</em> (margen de ventas), la visualización mostrará el aspecto mostrado en la siguiente imagen, mostrándose la cifra de dichas métricas para la fecha sobre la que mantengamos el cursor:
Una opción muy útil: Si movemos el cursor encima de alguna de estas sparklines, pasa a ocupar la posición de la gráfica principal. Para volver al estado inicial, basta con mover el cursor fuera de la visualización.
Los campos <em>Warning State</em> y <em>Change start</em> date no parecen estar siendo considerados (lo estarán, simplemente no consigo ver cómo se aplican).
Visualización sumamente práctica y muy configurable, tal vez solo se le puede echar en cara la falta de documentación al respecto de los campos mencionados y de algunas de las opciones de formato que no resultan excesivamente obvias.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '989b4cd6-dcc3-4346-8608-9b230bc33a60') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Multi KPI</strong> de Microsoft permite presentar un KPI (indicador clave de rendimiento) junto a información adicional que puede resultar de interés.
Una vez instanciada en nuestro lienzo, podemos ver qué campos definen su configuración:
Comencemos llevando el campo <em>Date</em> del calendario de nuestro modelo de datos al campo <em>Date</em> de la visualización. Al campo <em>Values</em> deberemos llevar la métrica cuya evolución en el tiempo queremos analizar. Si se trata de una medida discreta, como el total de ventas por día, la gráfica resultante va a ser poco informativa:
Es por ello que resulta más interesante representar métricas como acumulados en el tiempo, o valores medios, etc. Si definimos, por ejemplo, la medida siguiente para calcular el acumulado de ventas:
Sales running total in Date =
CALCULATE(
[Sales];
FILTER(
ALLSELECTED('Calendar'[Date]);
ISONORAFTER('Calendar'[Date]; MAX('Calendar'[Date]); DESC)
)
)
...y la llevamos a nuestra visualización, el resultado es mucho más útil:
En la visualización se muestra el valor actual de la métrica (3 millones de euros), el incremento que esta cifra representa respecto al dato del primer día (354.33K%) y el número de días representados (1.825).
Moviendo el cursor por encima de la gráfica podemos ver, para la fecha correspondiente, cuál era el valor de la métrica:
En la imagen vemos que el sábado 4 de marzo de 2017 las ventas acumuladas eran de 1M€. Podemos cambiar el formato de los valores (para que se muestren en miles, por ejemplo) en <em>Formato > Values Display Units</em>, aunque esto puede obligarnos a modificar el tamaño de la fuente a usar con los valores. Para la gráfica principal podemos cambiar el tamaño de la fuente del valor representado desactivando la opción <em>Formato > KPI > Auto Font Size</em>, y fijando el tamaño que nos interese en <em>Formato > KPI > Value Font Size</em>. Por supuesto podemos configurar muchas otras características de la fuente. Los tamaños a usar cuando estemos moviendo el cursor por encima de la gráfica son configurables por separado, en <em>Formato > KPI On Hover</em>.
Si llevamos al campo <em>Values</em> de la visualización más de un campo de nuestro modelo de datos, se muestran pequeñas gráficas (<em>sparklines</em>) para éstos -completamente configurables- en la parte inferior de la visualización. Así, si llevamos los campos <em>Units</em> (número de unidades vendidas), <em>Sales</em> (cifra de ventas) y <em>Margin</em> (margen de ventas), la visualización mostrará el aspecto mostrado en la siguiente imagen, mostrándose la cifra de dichas métricas para la fecha sobre la que mantengamos el cursor:
Una opción muy útil: Si movemos el cursor encima de alguna de estas sparklines, pasa a ocupar la posición de la gráfica principal. Para volver al estado inicial, basta con mover el cursor fuera de la visualización.
Los campos <em>Warning State</em> y <em>Change start</em> date no parecen estar siendo considerados (lo estarán, simplemente no consigo ver cómo se aplican).
Visualización sumamente práctica y muy configurable, tal vez solo se le puede echar en cara la falta de documentación al respecto de los campos mencionados y de algunas de las opciones de formato que no resultan excesivamente obvias.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('file_load_multiple') (Line: 696)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->buildQuery(Array) (Line: 422)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->getFromStorage(Array) (Line: 393)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->doLoadMultiple(Array) (Line: 346)
Drupal\Core\Entity\EntityStorageBase->loadMultiple(Array) (Line: 641)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '989b4cd6-dcc3-4346-8608-9b230bc33a60') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Multi KPI</strong> de Microsoft permite presentar un KPI (indicador clave de rendimiento) junto a información adicional que puede resultar de interés.
Una vez instanciada en nuestro lienzo, podemos ver qué campos definen su configuración:
Comencemos llevando el campo <em>Date</em> del calendario de nuestro modelo de datos al campo <em>Date</em> de la visualización. Al campo <em>Values</em> deberemos llevar la métrica cuya evolución en el tiempo queremos analizar. Si se trata de una medida discreta, como el total de ventas por día, la gráfica resultante va a ser poco informativa:
Es por ello que resulta más interesante representar métricas como acumulados en el tiempo, o valores medios, etc. Si definimos, por ejemplo, la medida siguiente para calcular el acumulado de ventas:
Sales running total in Date =
CALCULATE(
[Sales];
FILTER(
ALLSELECTED('Calendar'[Date]);
ISONORAFTER('Calendar'[Date]; MAX('Calendar'[Date]); DESC)
)
)
...y la llevamos a nuestra visualización, el resultado es mucho más útil:
En la visualización se muestra el valor actual de la métrica (3 millones de euros), el incremento que esta cifra representa respecto al dato del primer día (354.33K%) y el número de días representados (1.825).
Moviendo el cursor por encima de la gráfica podemos ver, para la fecha correspondiente, cuál era el valor de la métrica:
En la imagen vemos que el sábado 4 de marzo de 2017 las ventas acumuladas eran de 1M€. Podemos cambiar el formato de los valores (para que se muestren en miles, por ejemplo) en <em>Formato > Values Display Units</em>, aunque esto puede obligarnos a modificar el tamaño de la fuente a usar con los valores. Para la gráfica principal podemos cambiar el tamaño de la fuente del valor representado desactivando la opción <em>Formato > KPI > Auto Font Size</em>, y fijando el tamaño que nos interese en <em>Formato > KPI > Value Font Size</em>. Por supuesto podemos configurar muchas otras características de la fuente. Los tamaños a usar cuando estemos moviendo el cursor por encima de la gráfica son configurables por separado, en <em>Formato > KPI On Hover</em>.
Si llevamos al campo <em>Values</em> de la visualización más de un campo de nuestro modelo de datos, se muestran pequeñas gráficas (<em>sparklines</em>) para éstos -completamente configurables- en la parte inferior de la visualización. Así, si llevamos los campos <em>Units</em> (número de unidades vendidas), <em>Sales</em> (cifra de ventas) y <em>Margin</em> (margen de ventas), la visualización mostrará el aspecto mostrado en la siguiente imagen, mostrándose la cifra de dichas métricas para la fecha sobre la que mantengamos el cursor:
Una opción muy útil: Si movemos el cursor encima de alguna de estas sparklines, pasa a ocupar la posición de la gráfica principal. Para volver al estado inicial, basta con mover el cursor fuera de la visualización.
Los campos <em>Warning State</em> y <em>Change start</em> date no parecen estar siendo considerados (lo estarán, simplemente no consigo ver cómo se aplican).
Visualización sumamente práctica y muy configurable, tal vez solo se le puede echar en cara la falta de documentación al respecto de los campos mencionados y de algunas de las opciones de formato que no resultan excesivamente obvias.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '989b4cd6-dcc3-4346-8608-9b230bc33a60') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Multi KPI</strong> de Microsoft permite presentar un KPI (indicador clave de rendimiento) junto a información adicional que puede resultar de interés.
Una vez instanciada en nuestro lienzo, podemos ver qué campos definen su configuración:
Comencemos llevando el campo <em>Date</em> del calendario de nuestro modelo de datos al campo <em>Date</em> de la visualización. Al campo <em>Values</em> deberemos llevar la métrica cuya evolución en el tiempo queremos analizar. Si se trata de una medida discreta, como el total de ventas por día, la gráfica resultante va a ser poco informativa:
Es por ello que resulta más interesante representar métricas como acumulados en el tiempo, o valores medios, etc. Si definimos, por ejemplo, la medida siguiente para calcular el acumulado de ventas:
Sales running total in Date =
CALCULATE(
[Sales];
FILTER(
ALLSELECTED('Calendar'[Date]);
ISONORAFTER('Calendar'[Date]; MAX('Calendar'[Date]); DESC)
)
)
...y la llevamos a nuestra visualización, el resultado es mucho más útil:
En la visualización se muestra el valor actual de la métrica (3 millones de euros), el incremento que esta cifra representa respecto al dato del primer día (354.33K%) y el número de días representados (1.825).
Moviendo el cursor por encima de la gráfica podemos ver, para la fecha correspondiente, cuál era el valor de la métrica:
En la imagen vemos que el sábado 4 de marzo de 2017 las ventas acumuladas eran de 1M€. Podemos cambiar el formato de los valores (para que se muestren en miles, por ejemplo) en <em>Formato > Values Display Units</em>, aunque esto puede obligarnos a modificar el tamaño de la fuente a usar con los valores. Para la gráfica principal podemos cambiar el tamaño de la fuente del valor representado desactivando la opción <em>Formato > KPI > Auto Font Size</em>, y fijando el tamaño que nos interese en <em>Formato > KPI > Value Font Size</em>. Por supuesto podemos configurar muchas otras características de la fuente. Los tamaños a usar cuando estemos moviendo el cursor por encima de la gráfica son configurables por separado, en <em>Formato > KPI On Hover</em>.
Si llevamos al campo <em>Values</em> de la visualización más de un campo de nuestro modelo de datos, se muestran pequeñas gráficas (<em>sparklines</em>) para éstos -completamente configurables- en la parte inferior de la visualización. Así, si llevamos los campos <em>Units</em> (número de unidades vendidas), <em>Sales</em> (cifra de ventas) y <em>Margin</em> (margen de ventas), la visualización mostrará el aspecto mostrado en la siguiente imagen, mostrándose la cifra de dichas métricas para la fecha sobre la que mantengamos el cursor:
Una opción muy útil: Si movemos el cursor encima de alguna de estas sparklines, pasa a ocupar la posición de la gráfica principal. Para volver al estado inicial, basta con mover el cursor fuera de la visualización.
Los campos <em>Warning State</em> y <em>Change start</em> date no parecen estar siendo considerados (lo estarán, simplemente no consigo ver cómo se aplican).
Visualización sumamente práctica y muy configurable, tal vez solo se le puede echar en cara la falta de documentación al respecto de los campos mencionados y de algunas de las opciones de formato que no resultan excesivamente obvias.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '989b4cd6-dcc3-4346-8608-9b230bc33a60') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Multi KPI</strong> de Microsoft permite presentar un KPI (indicador clave de rendimiento) junto a información adicional que puede resultar de interés.
Una vez instanciada en nuestro lienzo, podemos ver qué campos definen su configuración:
Comencemos llevando el campo <em>Date</em> del calendario de nuestro modelo de datos al campo <em>Date</em> de la visualización. Al campo <em>Values</em> deberemos llevar la métrica cuya evolución en el tiempo queremos analizar. Si se trata de una medida discreta, como el total de ventas por día, la gráfica resultante va a ser poco informativa:
Es por ello que resulta más interesante representar métricas como acumulados en el tiempo, o valores medios, etc. Si definimos, por ejemplo, la medida siguiente para calcular el acumulado de ventas:
Sales running total in Date =
CALCULATE(
[Sales];
FILTER(
ALLSELECTED('Calendar'[Date]);
ISONORAFTER('Calendar'[Date]; MAX('Calendar'[Date]); DESC)
)
)
...y la llevamos a nuestra visualización, el resultado es mucho más útil:
En la visualización se muestra el valor actual de la métrica (3 millones de euros), el incremento que esta cifra representa respecto al dato del primer día (354.33K%) y el número de días representados (1.825).
Moviendo el cursor por encima de la gráfica podemos ver, para la fecha correspondiente, cuál era el valor de la métrica:
En la imagen vemos que el sábado 4 de marzo de 2017 las ventas acumuladas eran de 1M€. Podemos cambiar el formato de los valores (para que se muestren en miles, por ejemplo) en <em>Formato > Values Display Units</em>, aunque esto puede obligarnos a modificar el tamaño de la fuente a usar con los valores. Para la gráfica principal podemos cambiar el tamaño de la fuente del valor representado desactivando la opción <em>Formato > KPI > Auto Font Size</em>, y fijando el tamaño que nos interese en <em>Formato > KPI > Value Font Size</em>. Por supuesto podemos configurar muchas otras características de la fuente. Los tamaños a usar cuando estemos moviendo el cursor por encima de la gráfica son configurables por separado, en <em>Formato > KPI On Hover</em>.
Si llevamos al campo <em>Values</em> de la visualización más de un campo de nuestro modelo de datos, se muestran pequeñas gráficas (<em>sparklines</em>) para éstos -completamente configurables- en la parte inferior de la visualización. Así, si llevamos los campos <em>Units</em> (número de unidades vendidas), <em>Sales</em> (cifra de ventas) y <em>Margin</em> (margen de ventas), la visualización mostrará el aspecto mostrado en la siguiente imagen, mostrándose la cifra de dichas métricas para la fecha sobre la que mantengamos el cursor:
Una opción muy útil: Si movemos el cursor encima de alguna de estas sparklines, pasa a ocupar la posición de la gráfica principal. Para volver al estado inicial, basta con mover el cursor fuera de la visualización.
Los campos <em>Warning State</em> y <em>Change start</em> date no parecen estar siendo considerados (lo estarán, simplemente no consigo ver cómo se aplican).
Visualización sumamente práctica y muy configurable, tal vez solo se le puede echar en cara la falta de documentación al respecto de los campos mencionados y de algunas de las opciones de formato que no resultan excesivamente obvias.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '27b51a97-0ac5-40b2-abb0-9e708b1db394') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Multi KPI</strong> de Microsoft permite presentar un KPI (indicador clave de rendimiento) junto a información adicional que puede resultar de interés.
Una vez instanciada en nuestro lienzo, podemos ver qué campos definen su configuración:
Comencemos llevando el campo <em>Date</em> del calendario de nuestro modelo de datos al campo <em>Date</em> de la visualización. Al campo <em>Values</em> deberemos llevar la métrica cuya evolución en el tiempo queremos analizar. Si se trata de una medida discreta, como el total de ventas por día, la gráfica resultante va a ser poco informativa:
Es por ello que resulta más interesante representar métricas como acumulados en el tiempo, o valores medios, etc. Si definimos, por ejemplo, la medida siguiente para calcular el acumulado de ventas:
Sales running total in Date =
CALCULATE(
[Sales];
FILTER(
ALLSELECTED('Calendar'[Date]);
ISONORAFTER('Calendar'[Date]; MAX('Calendar'[Date]); DESC)
)
)
...y la llevamos a nuestra visualización, el resultado es mucho más útil:
En la visualización se muestra el valor actual de la métrica (3 millones de euros), el incremento que esta cifra representa respecto al dato del primer día (354.33K%) y el número de días representados (1.825).
Moviendo el cursor por encima de la gráfica podemos ver, para la fecha correspondiente, cuál era el valor de la métrica:
En la imagen vemos que el sábado 4 de marzo de 2017 las ventas acumuladas eran de 1M€. Podemos cambiar el formato de los valores (para que se muestren en miles, por ejemplo) en <em>Formato > Values Display Units</em>, aunque esto puede obligarnos a modificar el tamaño de la fuente a usar con los valores. Para la gráfica principal podemos cambiar el tamaño de la fuente del valor representado desactivando la opción <em>Formato > KPI > Auto Font Size</em>, y fijando el tamaño que nos interese en <em>Formato > KPI > Value Font Size</em>. Por supuesto podemos configurar muchas otras características de la fuente. Los tamaños a usar cuando estemos moviendo el cursor por encima de la gráfica son configurables por separado, en <em>Formato > KPI On Hover</em>.
Si llevamos al campo <em>Values</em> de la visualización más de un campo de nuestro modelo de datos, se muestran pequeñas gráficas (<em>sparklines</em>) para éstos -completamente configurables- en la parte inferior de la visualización. Así, si llevamos los campos <em>Units</em> (número de unidades vendidas), <em>Sales</em> (cifra de ventas) y <em>Margin</em> (margen de ventas), la visualización mostrará el aspecto mostrado en la siguiente imagen, mostrándose la cifra de dichas métricas para la fecha sobre la que mantengamos el cursor:
Una opción muy útil: Si movemos el cursor encima de alguna de estas sparklines, pasa a ocupar la posición de la gráfica principal. Para volver al estado inicial, basta con mover el cursor fuera de la visualización.
Los campos <em>Warning State</em> y <em>Change start</em> date no parecen estar siendo considerados (lo estarán, simplemente no consigo ver cómo se aplican).
Visualización sumamente práctica y muy configurable, tal vez solo se le puede echar en cara la falta de documentación al respecto de los campos mencionados y de algunas de las opciones de formato que no resultan excesivamente obvias.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '27b51a97-0ac5-40b2-abb0-9e708b1db394') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Multi KPI</strong> de Microsoft permite presentar un KPI (indicador clave de rendimiento) junto a información adicional que puede resultar de interés.
Una vez instanciada en nuestro lienzo, podemos ver qué campos definen su configuración:
Comencemos llevando el campo <em>Date</em> del calendario de nuestro modelo de datos al campo <em>Date</em> de la visualización. Al campo <em>Values</em> deberemos llevar la métrica cuya evolución en el tiempo queremos analizar. Si se trata de una medida discreta, como el total de ventas por día, la gráfica resultante va a ser poco informativa:
Es por ello que resulta más interesante representar métricas como acumulados en el tiempo, o valores medios, etc. Si definimos, por ejemplo, la medida siguiente para calcular el acumulado de ventas:
Sales running total in Date =
CALCULATE(
[Sales];
FILTER(
ALLSELECTED('Calendar'[Date]);
ISONORAFTER('Calendar'[Date]; MAX('Calendar'[Date]); DESC)
)
)
...y la llevamos a nuestra visualización, el resultado es mucho más útil:
En la visualización se muestra el valor actual de la métrica (3 millones de euros), el incremento que esta cifra representa respecto al dato del primer día (354.33K%) y el número de días representados (1.825).
Moviendo el cursor por encima de la gráfica podemos ver, para la fecha correspondiente, cuál era el valor de la métrica:
En la imagen vemos que el sábado 4 de marzo de 2017 las ventas acumuladas eran de 1M€. Podemos cambiar el formato de los valores (para que se muestren en miles, por ejemplo) en <em>Formato > Values Display Units</em>, aunque esto puede obligarnos a modificar el tamaño de la fuente a usar con los valores. Para la gráfica principal podemos cambiar el tamaño de la fuente del valor representado desactivando la opción <em>Formato > KPI > Auto Font Size</em>, y fijando el tamaño que nos interese en <em>Formato > KPI > Value Font Size</em>. Por supuesto podemos configurar muchas otras características de la fuente. Los tamaños a usar cuando estemos moviendo el cursor por encima de la gráfica son configurables por separado, en <em>Formato > KPI On Hover</em>.
Si llevamos al campo <em>Values</em> de la visualización más de un campo de nuestro modelo de datos, se muestran pequeñas gráficas (<em>sparklines</em>) para éstos -completamente configurables- en la parte inferior de la visualización. Así, si llevamos los campos <em>Units</em> (número de unidades vendidas), <em>Sales</em> (cifra de ventas) y <em>Margin</em> (margen de ventas), la visualización mostrará el aspecto mostrado en la siguiente imagen, mostrándose la cifra de dichas métricas para la fecha sobre la que mantengamos el cursor:
Una opción muy útil: Si movemos el cursor encima de alguna de estas sparklines, pasa a ocupar la posición de la gráfica principal. Para volver al estado inicial, basta con mover el cursor fuera de la visualización.
Los campos <em>Warning State</em> y <em>Change start</em> date no parecen estar siendo considerados (lo estarán, simplemente no consigo ver cómo se aplican).
Visualización sumamente práctica y muy configurable, tal vez solo se le puede echar en cara la falta de documentación al respecto de los campos mencionados y de algunas de las opciones de formato que no resultan excesivamente obvias.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('file_load_multiple') (Line: 696)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->buildQuery(Array) (Line: 422)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->getFromStorage(Array) (Line: 393)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->doLoadMultiple(Array) (Line: 346)
Drupal\Core\Entity\EntityStorageBase->loadMultiple(Array) (Line: 641)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '27b51a97-0ac5-40b2-abb0-9e708b1db394') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Multi KPI</strong> de Microsoft permite presentar un KPI (indicador clave de rendimiento) junto a información adicional que puede resultar de interés.
Una vez instanciada en nuestro lienzo, podemos ver qué campos definen su configuración:
Comencemos llevando el campo <em>Date</em> del calendario de nuestro modelo de datos al campo <em>Date</em> de la visualización. Al campo <em>Values</em> deberemos llevar la métrica cuya evolución en el tiempo queremos analizar. Si se trata de una medida discreta, como el total de ventas por día, la gráfica resultante va a ser poco informativa:
Es por ello que resulta más interesante representar métricas como acumulados en el tiempo, o valores medios, etc. Si definimos, por ejemplo, la medida siguiente para calcular el acumulado de ventas:
Sales running total in Date =
CALCULATE(
[Sales];
FILTER(
ALLSELECTED('Calendar'[Date]);
ISONORAFTER('Calendar'[Date]; MAX('Calendar'[Date]); DESC)
)
)
...y la llevamos a nuestra visualización, el resultado es mucho más útil:
En la visualización se muestra el valor actual de la métrica (3 millones de euros), el incremento que esta cifra representa respecto al dato del primer día (354.33K%) y el número de días representados (1.825).
Moviendo el cursor por encima de la gráfica podemos ver, para la fecha correspondiente, cuál era el valor de la métrica:
En la imagen vemos que el sábado 4 de marzo de 2017 las ventas acumuladas eran de 1M€. Podemos cambiar el formato de los valores (para que se muestren en miles, por ejemplo) en <em>Formato > Values Display Units</em>, aunque esto puede obligarnos a modificar el tamaño de la fuente a usar con los valores. Para la gráfica principal podemos cambiar el tamaño de la fuente del valor representado desactivando la opción <em>Formato > KPI > Auto Font Size</em>, y fijando el tamaño que nos interese en <em>Formato > KPI > Value Font Size</em>. Por supuesto podemos configurar muchas otras características de la fuente. Los tamaños a usar cuando estemos moviendo el cursor por encima de la gráfica son configurables por separado, en <em>Formato > KPI On Hover</em>.
Si llevamos al campo <em>Values</em> de la visualización más de un campo de nuestro modelo de datos, se muestran pequeñas gráficas (<em>sparklines</em>) para éstos -completamente configurables- en la parte inferior de la visualización. Así, si llevamos los campos <em>Units</em> (número de unidades vendidas), <em>Sales</em> (cifra de ventas) y <em>Margin</em> (margen de ventas), la visualización mostrará el aspecto mostrado en la siguiente imagen, mostrándose la cifra de dichas métricas para la fecha sobre la que mantengamos el cursor:
Una opción muy útil: Si movemos el cursor encima de alguna de estas sparklines, pasa a ocupar la posición de la gráfica principal. Para volver al estado inicial, basta con mover el cursor fuera de la visualización.
Los campos <em>Warning State</em> y <em>Change start</em> date no parecen estar siendo considerados (lo estarán, simplemente no consigo ver cómo se aplican).
Visualización sumamente práctica y muy configurable, tal vez solo se le puede echar en cara la falta de documentación al respecto de los campos mencionados y de algunas de las opciones de formato que no resultan excesivamente obvias.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '27b51a97-0ac5-40b2-abb0-9e708b1db394') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Multi KPI</strong> de Microsoft permite presentar un KPI (indicador clave de rendimiento) junto a información adicional que puede resultar de interés.
Una vez instanciada en nuestro lienzo, podemos ver qué campos definen su configuración:
Comencemos llevando el campo <em>Date</em> del calendario de nuestro modelo de datos al campo <em>Date</em> de la visualización. Al campo <em>Values</em> deberemos llevar la métrica cuya evolución en el tiempo queremos analizar. Si se trata de una medida discreta, como el total de ventas por día, la gráfica resultante va a ser poco informativa:
Es por ello que resulta más interesante representar métricas como acumulados en el tiempo, o valores medios, etc. Si definimos, por ejemplo, la medida siguiente para calcular el acumulado de ventas:
Sales running total in Date =
CALCULATE(
[Sales];
FILTER(
ALLSELECTED('Calendar'[Date]);
ISONORAFTER('Calendar'[Date]; MAX('Calendar'[Date]); DESC)
)
)
...y la llevamos a nuestra visualización, el resultado es mucho más útil:
En la visualización se muestra el valor actual de la métrica (3 millones de euros), el incremento que esta cifra representa respecto al dato del primer día (354.33K%) y el número de días representados (1.825).
Moviendo el cursor por encima de la gráfica podemos ver, para la fecha correspondiente, cuál era el valor de la métrica:
En la imagen vemos que el sábado 4 de marzo de 2017 las ventas acumuladas eran de 1M€. Podemos cambiar el formato de los valores (para que se muestren en miles, por ejemplo) en <em>Formato > Values Display Units</em>, aunque esto puede obligarnos a modificar el tamaño de la fuente a usar con los valores. Para la gráfica principal podemos cambiar el tamaño de la fuente del valor representado desactivando la opción <em>Formato > KPI > Auto Font Size</em>, y fijando el tamaño que nos interese en <em>Formato > KPI > Value Font Size</em>. Por supuesto podemos configurar muchas otras características de la fuente. Los tamaños a usar cuando estemos moviendo el cursor por encima de la gráfica son configurables por separado, en <em>Formato > KPI On Hover</em>.
Si llevamos al campo <em>Values</em> de la visualización más de un campo de nuestro modelo de datos, se muestran pequeñas gráficas (<em>sparklines</em>) para éstos -completamente configurables- en la parte inferior de la visualización. Así, si llevamos los campos <em>Units</em> (número de unidades vendidas), <em>Sales</em> (cifra de ventas) y <em>Margin</em> (margen de ventas), la visualización mostrará el aspecto mostrado en la siguiente imagen, mostrándose la cifra de dichas métricas para la fecha sobre la que mantengamos el cursor:
Una opción muy útil: Si movemos el cursor encima de alguna de estas sparklines, pasa a ocupar la posición de la gráfica principal. Para volver al estado inicial, basta con mover el cursor fuera de la visualización.
Los campos <em>Warning State</em> y <em>Change start</em> date no parecen estar siendo considerados (lo estarán, simplemente no consigo ver cómo se aplican).
Visualización sumamente práctica y muy configurable, tal vez solo se le puede echar en cara la falta de documentación al respecto de los campos mencionados y de algunas de las opciones de formato que no resultan excesivamente obvias.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '27b51a97-0ac5-40b2-abb0-9e708b1db394') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Multi KPI</strong> de Microsoft permite presentar un KPI (indicador clave de rendimiento) junto a información adicional que puede resultar de interés.
Una vez instanciada en nuestro lienzo, podemos ver qué campos definen su configuración:
Comencemos llevando el campo <em>Date</em> del calendario de nuestro modelo de datos al campo <em>Date</em> de la visualización. Al campo <em>Values</em> deberemos llevar la métrica cuya evolución en el tiempo queremos analizar. Si se trata de una medida discreta, como el total de ventas por día, la gráfica resultante va a ser poco informativa:
Es por ello que resulta más interesante representar métricas como acumulados en el tiempo, o valores medios, etc. Si definimos, por ejemplo, la medida siguiente para calcular el acumulado de ventas:
Sales running total in Date =
CALCULATE(
[Sales];
FILTER(
ALLSELECTED('Calendar'[Date]);
ISONORAFTER('Calendar'[Date]; MAX('Calendar'[Date]); DESC)
)
)
...y la llevamos a nuestra visualización, el resultado es mucho más útil:
En la visualización se muestra el valor actual de la métrica (3 millones de euros), el incremento que esta cifra representa respecto al dato del primer día (354.33K%) y el número de días representados (1.825).
Moviendo el cursor por encima de la gráfica podemos ver, para la fecha correspondiente, cuál era el valor de la métrica:
En la imagen vemos que el sábado 4 de marzo de 2017 las ventas acumuladas eran de 1M€. Podemos cambiar el formato de los valores (para que se muestren en miles, por ejemplo) en <em>Formato > Values Display Units</em>, aunque esto puede obligarnos a modificar el tamaño de la fuente a usar con los valores. Para la gráfica principal podemos cambiar el tamaño de la fuente del valor representado desactivando la opción <em>Formato > KPI > Auto Font Size</em>, y fijando el tamaño que nos interese en <em>Formato > KPI > Value Font Size</em>. Por supuesto podemos configurar muchas otras características de la fuente. Los tamaños a usar cuando estemos moviendo el cursor por encima de la gráfica son configurables por separado, en <em>Formato > KPI On Hover</em>.
Si llevamos al campo <em>Values</em> de la visualización más de un campo de nuestro modelo de datos, se muestran pequeñas gráficas (<em>sparklines</em>) para éstos -completamente configurables- en la parte inferior de la visualización. Así, si llevamos los campos <em>Units</em> (número de unidades vendidas), <em>Sales</em> (cifra de ventas) y <em>Margin</em> (margen de ventas), la visualización mostrará el aspecto mostrado en la siguiente imagen, mostrándose la cifra de dichas métricas para la fecha sobre la que mantengamos el cursor:
Una opción muy útil: Si movemos el cursor encima de alguna de estas sparklines, pasa a ocupar la posición de la gráfica principal. Para volver al estado inicial, basta con mover el cursor fuera de la visualización.
Los campos <em>Warning State</em> y <em>Change start</em> date no parecen estar siendo considerados (lo estarán, simplemente no consigo ver cómo se aplican).
Visualización sumamente práctica y muy configurable, tal vez solo se le puede echar en cara la falta de documentación al respecto de los campos mencionados y de algunas de las opciones de formato que no resultan excesivamente obvias.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '20dfd04d-26a3-48d9-8c42-1aeb4b16be01') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Multi KPI</strong> de Microsoft permite presentar un KPI (indicador clave de rendimiento) junto a información adicional que puede resultar de interés.
Una vez instanciada en nuestro lienzo, podemos ver qué campos definen su configuración:
Comencemos llevando el campo <em>Date</em> del calendario de nuestro modelo de datos al campo <em>Date</em> de la visualización. Al campo <em>Values</em> deberemos llevar la métrica cuya evolución en el tiempo queremos analizar. Si se trata de una medida discreta, como el total de ventas por día, la gráfica resultante va a ser poco informativa:
Es por ello que resulta más interesante representar métricas como acumulados en el tiempo, o valores medios, etc. Si definimos, por ejemplo, la medida siguiente para calcular el acumulado de ventas:
Sales running total in Date =
CALCULATE(
[Sales];
FILTER(
ALLSELECTED('Calendar'[Date]);
ISONORAFTER('Calendar'[Date]; MAX('Calendar'[Date]); DESC)
)
)
...y la llevamos a nuestra visualización, el resultado es mucho más útil:
En la visualización se muestra el valor actual de la métrica (3 millones de euros), el incremento que esta cifra representa respecto al dato del primer día (354.33K%) y el número de días representados (1.825).
Moviendo el cursor por encima de la gráfica podemos ver, para la fecha correspondiente, cuál era el valor de la métrica:
En la imagen vemos que el sábado 4 de marzo de 2017 las ventas acumuladas eran de 1M€. Podemos cambiar el formato de los valores (para que se muestren en miles, por ejemplo) en <em>Formato > Values Display Units</em>, aunque esto puede obligarnos a modificar el tamaño de la fuente a usar con los valores. Para la gráfica principal podemos cambiar el tamaño de la fuente del valor representado desactivando la opción <em>Formato > KPI > Auto Font Size</em>, y fijando el tamaño que nos interese en <em>Formato > KPI > Value Font Size</em>. Por supuesto podemos configurar muchas otras características de la fuente. Los tamaños a usar cuando estemos moviendo el cursor por encima de la gráfica son configurables por separado, en <em>Formato > KPI On Hover</em>.
Si llevamos al campo <em>Values</em> de la visualización más de un campo de nuestro modelo de datos, se muestran pequeñas gráficas (<em>sparklines</em>) para éstos -completamente configurables- en la parte inferior de la visualización. Así, si llevamos los campos <em>Units</em> (número de unidades vendidas), <em>Sales</em> (cifra de ventas) y <em>Margin</em> (margen de ventas), la visualización mostrará el aspecto mostrado en la siguiente imagen, mostrándose la cifra de dichas métricas para la fecha sobre la que mantengamos el cursor:
Una opción muy útil: Si movemos el cursor encima de alguna de estas sparklines, pasa a ocupar la posición de la gráfica principal. Para volver al estado inicial, basta con mover el cursor fuera de la visualización.
Los campos <em>Warning State</em> y <em>Change start</em> date no parecen estar siendo considerados (lo estarán, simplemente no consigo ver cómo se aplican).
Visualización sumamente práctica y muy configurable, tal vez solo se le puede echar en cara la falta de documentación al respecto de los campos mencionados y de algunas de las opciones de formato que no resultan excesivamente obvias.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '20dfd04d-26a3-48d9-8c42-1aeb4b16be01') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Multi KPI</strong> de Microsoft permite presentar un KPI (indicador clave de rendimiento) junto a información adicional que puede resultar de interés.
Una vez instanciada en nuestro lienzo, podemos ver qué campos definen su configuración:
Comencemos llevando el campo <em>Date</em> del calendario de nuestro modelo de datos al campo <em>Date</em> de la visualización. Al campo <em>Values</em> deberemos llevar la métrica cuya evolución en el tiempo queremos analizar. Si se trata de una medida discreta, como el total de ventas por día, la gráfica resultante va a ser poco informativa:
Es por ello que resulta más interesante representar métricas como acumulados en el tiempo, o valores medios, etc. Si definimos, por ejemplo, la medida siguiente para calcular el acumulado de ventas:
Sales running total in Date =
CALCULATE(
[Sales];
FILTER(
ALLSELECTED('Calendar'[Date]);
ISONORAFTER('Calendar'[Date]; MAX('Calendar'[Date]); DESC)
)
)
...y la llevamos a nuestra visualización, el resultado es mucho más útil:
En la visualización se muestra el valor actual de la métrica (3 millones de euros), el incremento que esta cifra representa respecto al dato del primer día (354.33K%) y el número de días representados (1.825).
Moviendo el cursor por encima de la gráfica podemos ver, para la fecha correspondiente, cuál era el valor de la métrica:
En la imagen vemos que el sábado 4 de marzo de 2017 las ventas acumuladas eran de 1M€. Podemos cambiar el formato de los valores (para que se muestren en miles, por ejemplo) en <em>Formato > Values Display Units</em>, aunque esto puede obligarnos a modificar el tamaño de la fuente a usar con los valores. Para la gráfica principal podemos cambiar el tamaño de la fuente del valor representado desactivando la opción <em>Formato > KPI > Auto Font Size</em>, y fijando el tamaño que nos interese en <em>Formato > KPI > Value Font Size</em>. Por supuesto podemos configurar muchas otras características de la fuente. Los tamaños a usar cuando estemos moviendo el cursor por encima de la gráfica son configurables por separado, en <em>Formato > KPI On Hover</em>.
Si llevamos al campo <em>Values</em> de la visualización más de un campo de nuestro modelo de datos, se muestran pequeñas gráficas (<em>sparklines</em>) para éstos -completamente configurables- en la parte inferior de la visualización. Así, si llevamos los campos <em>Units</em> (número de unidades vendidas), <em>Sales</em> (cifra de ventas) y <em>Margin</em> (margen de ventas), la visualización mostrará el aspecto mostrado en la siguiente imagen, mostrándose la cifra de dichas métricas para la fecha sobre la que mantengamos el cursor:
Una opción muy útil: Si movemos el cursor encima de alguna de estas sparklines, pasa a ocupar la posición de la gráfica principal. Para volver al estado inicial, basta con mover el cursor fuera de la visualización.
Los campos <em>Warning State</em> y <em>Change start</em> date no parecen estar siendo considerados (lo estarán, simplemente no consigo ver cómo se aplican).
Visualización sumamente práctica y muy configurable, tal vez solo se le puede echar en cara la falta de documentación al respecto de los campos mencionados y de algunas de las opciones de formato que no resultan excesivamente obvias.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('file_load_multiple') (Line: 696)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->buildQuery(Array) (Line: 422)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->getFromStorage(Array) (Line: 393)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->doLoadMultiple(Array) (Line: 346)
Drupal\Core\Entity\EntityStorageBase->loadMultiple(Array) (Line: 641)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '20dfd04d-26a3-48d9-8c42-1aeb4b16be01') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Multi KPI</strong> de Microsoft permite presentar un KPI (indicador clave de rendimiento) junto a información adicional que puede resultar de interés.
Una vez instanciada en nuestro lienzo, podemos ver qué campos definen su configuración:
Comencemos llevando el campo <em>Date</em> del calendario de nuestro modelo de datos al campo <em>Date</em> de la visualización. Al campo <em>Values</em> deberemos llevar la métrica cuya evolución en el tiempo queremos analizar. Si se trata de una medida discreta, como el total de ventas por día, la gráfica resultante va a ser poco informativa:
Es por ello que resulta más interesante representar métricas como acumulados en el tiempo, o valores medios, etc. Si definimos, por ejemplo, la medida siguiente para calcular el acumulado de ventas:
Sales running total in Date =
CALCULATE(
[Sales];
FILTER(
ALLSELECTED('Calendar'[Date]);
ISONORAFTER('Calendar'[Date]; MAX('Calendar'[Date]); DESC)
)
)
...y la llevamos a nuestra visualización, el resultado es mucho más útil:
En la visualización se muestra el valor actual de la métrica (3 millones de euros), el incremento que esta cifra representa respecto al dato del primer día (354.33K%) y el número de días representados (1.825).
Moviendo el cursor por encima de la gráfica podemos ver, para la fecha correspondiente, cuál era el valor de la métrica:
En la imagen vemos que el sábado 4 de marzo de 2017 las ventas acumuladas eran de 1M€. Podemos cambiar el formato de los valores (para que se muestren en miles, por ejemplo) en <em>Formato > Values Display Units</em>, aunque esto puede obligarnos a modificar el tamaño de la fuente a usar con los valores. Para la gráfica principal podemos cambiar el tamaño de la fuente del valor representado desactivando la opción <em>Formato > KPI > Auto Font Size</em>, y fijando el tamaño que nos interese en <em>Formato > KPI > Value Font Size</em>. Por supuesto podemos configurar muchas otras características de la fuente. Los tamaños a usar cuando estemos moviendo el cursor por encima de la gráfica son configurables por separado, en <em>Formato > KPI On Hover</em>.
Si llevamos al campo <em>Values</em> de la visualización más de un campo de nuestro modelo de datos, se muestran pequeñas gráficas (<em>sparklines</em>) para éstos -completamente configurables- en la parte inferior de la visualización. Así, si llevamos los campos <em>Units</em> (número de unidades vendidas), <em>Sales</em> (cifra de ventas) y <em>Margin</em> (margen de ventas), la visualización mostrará el aspecto mostrado en la siguiente imagen, mostrándose la cifra de dichas métricas para la fecha sobre la que mantengamos el cursor:
Una opción muy útil: Si movemos el cursor encima de alguna de estas sparklines, pasa a ocupar la posición de la gráfica principal. Para volver al estado inicial, basta con mover el cursor fuera de la visualización.
Los campos <em>Warning State</em> y <em>Change start</em> date no parecen estar siendo considerados (lo estarán, simplemente no consigo ver cómo se aplican).
Visualización sumamente práctica y muy configurable, tal vez solo se le puede echar en cara la falta de documentación al respecto de los campos mencionados y de algunas de las opciones de formato que no resultan excesivamente obvias.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '20dfd04d-26a3-48d9-8c42-1aeb4b16be01') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Multi KPI</strong> de Microsoft permite presentar un KPI (indicador clave de rendimiento) junto a información adicional que puede resultar de interés.
Una vez instanciada en nuestro lienzo, podemos ver qué campos definen su configuración:
Comencemos llevando el campo <em>Date</em> del calendario de nuestro modelo de datos al campo <em>Date</em> de la visualización. Al campo <em>Values</em> deberemos llevar la métrica cuya evolución en el tiempo queremos analizar. Si se trata de una medida discreta, como el total de ventas por día, la gráfica resultante va a ser poco informativa:
Es por ello que resulta más interesante representar métricas como acumulados en el tiempo, o valores medios, etc. Si definimos, por ejemplo, la medida siguiente para calcular el acumulado de ventas:
Sales running total in Date =
CALCULATE(
[Sales];
FILTER(
ALLSELECTED('Calendar'[Date]);
ISONORAFTER('Calendar'[Date]; MAX('Calendar'[Date]); DESC)
)
)
...y la llevamos a nuestra visualización, el resultado es mucho más útil:
En la visualización se muestra el valor actual de la métrica (3 millones de euros), el incremento que esta cifra representa respecto al dato del primer día (354.33K%) y el número de días representados (1.825).
Moviendo el cursor por encima de la gráfica podemos ver, para la fecha correspondiente, cuál era el valor de la métrica:
En la imagen vemos que el sábado 4 de marzo de 2017 las ventas acumuladas eran de 1M€. Podemos cambiar el formato de los valores (para que se muestren en miles, por ejemplo) en <em>Formato > Values Display Units</em>, aunque esto puede obligarnos a modificar el tamaño de la fuente a usar con los valores. Para la gráfica principal podemos cambiar el tamaño de la fuente del valor representado desactivando la opción <em>Formato > KPI > Auto Font Size</em>, y fijando el tamaño que nos interese en <em>Formato > KPI > Value Font Size</em>. Por supuesto podemos configurar muchas otras características de la fuente. Los tamaños a usar cuando estemos moviendo el cursor por encima de la gráfica son configurables por separado, en <em>Formato > KPI On Hover</em>.
Si llevamos al campo <em>Values</em> de la visualización más de un campo de nuestro modelo de datos, se muestran pequeñas gráficas (<em>sparklines</em>) para éstos -completamente configurables- en la parte inferior de la visualización. Así, si llevamos los campos <em>Units</em> (número de unidades vendidas), <em>Sales</em> (cifra de ventas) y <em>Margin</em> (margen de ventas), la visualización mostrará el aspecto mostrado en la siguiente imagen, mostrándose la cifra de dichas métricas para la fecha sobre la que mantengamos el cursor:
Una opción muy útil: Si movemos el cursor encima de alguna de estas sparklines, pasa a ocupar la posición de la gráfica principal. Para volver al estado inicial, basta con mover el cursor fuera de la visualización.
Los campos <em>Warning State</em> y <em>Change start</em> date no parecen estar siendo considerados (lo estarán, simplemente no consigo ver cómo se aplican).
Visualización sumamente práctica y muy configurable, tal vez solo se le puede echar en cara la falta de documentación al respecto de los campos mencionados y de algunas de las opciones de formato que no resultan excesivamente obvias.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '20dfd04d-26a3-48d9-8c42-1aeb4b16be01') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Multi KPI</strong> de Microsoft permite presentar un KPI (indicador clave de rendimiento) junto a información adicional que puede resultar de interés.
Una vez instanciada en nuestro lienzo, podemos ver qué campos definen su configuración:
Comencemos llevando el campo <em>Date</em> del calendario de nuestro modelo de datos al campo <em>Date</em> de la visualización. Al campo <em>Values</em> deberemos llevar la métrica cuya evolución en el tiempo queremos analizar. Si se trata de una medida discreta, como el total de ventas por día, la gráfica resultante va a ser poco informativa:
Es por ello que resulta más interesante representar métricas como acumulados en el tiempo, o valores medios, etc. Si definimos, por ejemplo, la medida siguiente para calcular el acumulado de ventas:
Sales running total in Date =
CALCULATE(
[Sales];
FILTER(
ALLSELECTED('Calendar'[Date]);
ISONORAFTER('Calendar'[Date]; MAX('Calendar'[Date]); DESC)
)
)
...y la llevamos a nuestra visualización, el resultado es mucho más útil:
En la visualización se muestra el valor actual de la métrica (3 millones de euros), el incremento que esta cifra representa respecto al dato del primer día (354.33K%) y el número de días representados (1.825).
Moviendo el cursor por encima de la gráfica podemos ver, para la fecha correspondiente, cuál era el valor de la métrica:
En la imagen vemos que el sábado 4 de marzo de 2017 las ventas acumuladas eran de 1M€. Podemos cambiar el formato de los valores (para que se muestren en miles, por ejemplo) en <em>Formato > Values Display Units</em>, aunque esto puede obligarnos a modificar el tamaño de la fuente a usar con los valores. Para la gráfica principal podemos cambiar el tamaño de la fuente del valor representado desactivando la opción <em>Formato > KPI > Auto Font Size</em>, y fijando el tamaño que nos interese en <em>Formato > KPI > Value Font Size</em>. Por supuesto podemos configurar muchas otras características de la fuente. Los tamaños a usar cuando estemos moviendo el cursor por encima de la gráfica son configurables por separado, en <em>Formato > KPI On Hover</em>.
Si llevamos al campo <em>Values</em> de la visualización más de un campo de nuestro modelo de datos, se muestran pequeñas gráficas (<em>sparklines</em>) para éstos -completamente configurables- en la parte inferior de la visualización. Así, si llevamos los campos <em>Units</em> (número de unidades vendidas), <em>Sales</em> (cifra de ventas) y <em>Margin</em> (margen de ventas), la visualización mostrará el aspecto mostrado en la siguiente imagen, mostrándose la cifra de dichas métricas para la fecha sobre la que mantengamos el cursor:
Una opción muy útil: Si movemos el cursor encima de alguna de estas sparklines, pasa a ocupar la posición de la gráfica principal. Para volver al estado inicial, basta con mover el cursor fuera de la visualización.
Los campos <em>Warning State</em> y <em>Change start</em> date no parecen estar siendo considerados (lo estarán, simplemente no consigo ver cómo se aplican).
Visualización sumamente práctica y muy configurable, tal vez solo se le puede echar en cara la falta de documentación al respecto de los campos mencionados y de algunas de las opciones de formato que no resultan excesivamente obvias.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '78e6968d-a9bc-4584-a509-ae06835a660f') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Multi KPI</strong> de Microsoft permite presentar un KPI (indicador clave de rendimiento) junto a información adicional que puede resultar de interés.
Una vez instanciada en nuestro lienzo, podemos ver qué campos definen su configuración:
Comencemos llevando el campo <em>Date</em> del calendario de nuestro modelo de datos al campo <em>Date</em> de la visualización. Al campo <em>Values</em> deberemos llevar la métrica cuya evolución en el tiempo queremos analizar. Si se trata de una medida discreta, como el total de ventas por día, la gráfica resultante va a ser poco informativa:
Es por ello que resulta más interesante representar métricas como acumulados en el tiempo, o valores medios, etc. Si definimos, por ejemplo, la medida siguiente para calcular el acumulado de ventas:
Sales running total in Date =
CALCULATE(
[Sales];
FILTER(
ALLSELECTED('Calendar'[Date]);
ISONORAFTER('Calendar'[Date]; MAX('Calendar'[Date]); DESC)
)
)
...y la llevamos a nuestra visualización, el resultado es mucho más útil:
En la visualización se muestra el valor actual de la métrica (3 millones de euros), el incremento que esta cifra representa respecto al dato del primer día (354.33K%) y el número de días representados (1.825).
Moviendo el cursor por encima de la gráfica podemos ver, para la fecha correspondiente, cuál era el valor de la métrica:
En la imagen vemos que el sábado 4 de marzo de 2017 las ventas acumuladas eran de 1M€. Podemos cambiar el formato de los valores (para que se muestren en miles, por ejemplo) en <em>Formato > Values Display Units</em>, aunque esto puede obligarnos a modificar el tamaño de la fuente a usar con los valores. Para la gráfica principal podemos cambiar el tamaño de la fuente del valor representado desactivando la opción <em>Formato > KPI > Auto Font Size</em>, y fijando el tamaño que nos interese en <em>Formato > KPI > Value Font Size</em>. Por supuesto podemos configurar muchas otras características de la fuente. Los tamaños a usar cuando estemos moviendo el cursor por encima de la gráfica son configurables por separado, en <em>Formato > KPI On Hover</em>.
Si llevamos al campo <em>Values</em> de la visualización más de un campo de nuestro modelo de datos, se muestran pequeñas gráficas (<em>sparklines</em>) para éstos -completamente configurables- en la parte inferior de la visualización. Así, si llevamos los campos <em>Units</em> (número de unidades vendidas), <em>Sales</em> (cifra de ventas) y <em>Margin</em> (margen de ventas), la visualización mostrará el aspecto mostrado en la siguiente imagen, mostrándose la cifra de dichas métricas para la fecha sobre la que mantengamos el cursor:
Una opción muy útil: Si movemos el cursor encima de alguna de estas sparklines, pasa a ocupar la posición de la gráfica principal. Para volver al estado inicial, basta con mover el cursor fuera de la visualización.
Los campos <em>Warning State</em> y <em>Change start</em> date no parecen estar siendo considerados (lo estarán, simplemente no consigo ver cómo se aplican).
Visualización sumamente práctica y muy configurable, tal vez solo se le puede echar en cara la falta de documentación al respecto de los campos mencionados y de algunas de las opciones de formato que no resultan excesivamente obvias.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '78e6968d-a9bc-4584-a509-ae06835a660f') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Multi KPI</strong> de Microsoft permite presentar un KPI (indicador clave de rendimiento) junto a información adicional que puede resultar de interés.
Una vez instanciada en nuestro lienzo, podemos ver qué campos definen su configuración:
Comencemos llevando el campo <em>Date</em> del calendario de nuestro modelo de datos al campo <em>Date</em> de la visualización. Al campo <em>Values</em> deberemos llevar la métrica cuya evolución en el tiempo queremos analizar. Si se trata de una medida discreta, como el total de ventas por día, la gráfica resultante va a ser poco informativa:
Es por ello que resulta más interesante representar métricas como acumulados en el tiempo, o valores medios, etc. Si definimos, por ejemplo, la medida siguiente para calcular el acumulado de ventas:
Sales running total in Date =
CALCULATE(
[Sales];
FILTER(
ALLSELECTED('Calendar'[Date]);
ISONORAFTER('Calendar'[Date]; MAX('Calendar'[Date]); DESC)
)
)
...y la llevamos a nuestra visualización, el resultado es mucho más útil:
En la visualización se muestra el valor actual de la métrica (3 millones de euros), el incremento que esta cifra representa respecto al dato del primer día (354.33K%) y el número de días representados (1.825).
Moviendo el cursor por encima de la gráfica podemos ver, para la fecha correspondiente, cuál era el valor de la métrica:
En la imagen vemos que el sábado 4 de marzo de 2017 las ventas acumuladas eran de 1M€. Podemos cambiar el formato de los valores (para que se muestren en miles, por ejemplo) en <em>Formato > Values Display Units</em>, aunque esto puede obligarnos a modificar el tamaño de la fuente a usar con los valores. Para la gráfica principal podemos cambiar el tamaño de la fuente del valor representado desactivando la opción <em>Formato > KPI > Auto Font Size</em>, y fijando el tamaño que nos interese en <em>Formato > KPI > Value Font Size</em>. Por supuesto podemos configurar muchas otras características de la fuente. Los tamaños a usar cuando estemos moviendo el cursor por encima de la gráfica son configurables por separado, en <em>Formato > KPI On Hover</em>.
Si llevamos al campo <em>Values</em> de la visualización más de un campo de nuestro modelo de datos, se muestran pequeñas gráficas (<em>sparklines</em>) para éstos -completamente configurables- en la parte inferior de la visualización. Así, si llevamos los campos <em>Units</em> (número de unidades vendidas), <em>Sales</em> (cifra de ventas) y <em>Margin</em> (margen de ventas), la visualización mostrará el aspecto mostrado en la siguiente imagen, mostrándose la cifra de dichas métricas para la fecha sobre la que mantengamos el cursor:
Una opción muy útil: Si movemos el cursor encima de alguna de estas sparklines, pasa a ocupar la posición de la gráfica principal. Para volver al estado inicial, basta con mover el cursor fuera de la visualización.
Los campos <em>Warning State</em> y <em>Change start</em> date no parecen estar siendo considerados (lo estarán, simplemente no consigo ver cómo se aplican).
Visualización sumamente práctica y muy configurable, tal vez solo se le puede echar en cara la falta de documentación al respecto de los campos mencionados y de algunas de las opciones de formato que no resultan excesivamente obvias.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('file_load_multiple') (Line: 696)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->buildQuery(Array) (Line: 422)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->getFromStorage(Array) (Line: 393)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->doLoadMultiple(Array) (Line: 346)
Drupal\Core\Entity\EntityStorageBase->loadMultiple(Array) (Line: 641)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '78e6968d-a9bc-4584-a509-ae06835a660f') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Multi KPI</strong> de Microsoft permite presentar un KPI (indicador clave de rendimiento) junto a información adicional que puede resultar de interés.
Una vez instanciada en nuestro lienzo, podemos ver qué campos definen su configuración:
Comencemos llevando el campo <em>Date</em> del calendario de nuestro modelo de datos al campo <em>Date</em> de la visualización. Al campo <em>Values</em> deberemos llevar la métrica cuya evolución en el tiempo queremos analizar. Si se trata de una medida discreta, como el total de ventas por día, la gráfica resultante va a ser poco informativa:
Es por ello que resulta más interesante representar métricas como acumulados en el tiempo, o valores medios, etc. Si definimos, por ejemplo, la medida siguiente para calcular el acumulado de ventas:
Sales running total in Date =
CALCULATE(
[Sales];
FILTER(
ALLSELECTED('Calendar'[Date]);
ISONORAFTER('Calendar'[Date]; MAX('Calendar'[Date]); DESC)
)
)
...y la llevamos a nuestra visualización, el resultado es mucho más útil:
En la visualización se muestra el valor actual de la métrica (3 millones de euros), el incremento que esta cifra representa respecto al dato del primer día (354.33K%) y el número de días representados (1.825).
Moviendo el cursor por encima de la gráfica podemos ver, para la fecha correspondiente, cuál era el valor de la métrica:
En la imagen vemos que el sábado 4 de marzo de 2017 las ventas acumuladas eran de 1M€. Podemos cambiar el formato de los valores (para que se muestren en miles, por ejemplo) en <em>Formato > Values Display Units</em>, aunque esto puede obligarnos a modificar el tamaño de la fuente a usar con los valores. Para la gráfica principal podemos cambiar el tamaño de la fuente del valor representado desactivando la opción <em>Formato > KPI > Auto Font Size</em>, y fijando el tamaño que nos interese en <em>Formato > KPI > Value Font Size</em>. Por supuesto podemos configurar muchas otras características de la fuente. Los tamaños a usar cuando estemos moviendo el cursor por encima de la gráfica son configurables por separado, en <em>Formato > KPI On Hover</em>.
Si llevamos al campo <em>Values</em> de la visualización más de un campo de nuestro modelo de datos, se muestran pequeñas gráficas (<em>sparklines</em>) para éstos -completamente configurables- en la parte inferior de la visualización. Así, si llevamos los campos <em>Units</em> (número de unidades vendidas), <em>Sales</em> (cifra de ventas) y <em>Margin</em> (margen de ventas), la visualización mostrará el aspecto mostrado en la siguiente imagen, mostrándose la cifra de dichas métricas para la fecha sobre la que mantengamos el cursor:
Una opción muy útil: Si movemos el cursor encima de alguna de estas sparklines, pasa a ocupar la posición de la gráfica principal. Para volver al estado inicial, basta con mover el cursor fuera de la visualización.
Los campos <em>Warning State</em> y <em>Change start</em> date no parecen estar siendo considerados (lo estarán, simplemente no consigo ver cómo se aplican).
Visualización sumamente práctica y muy configurable, tal vez solo se le puede echar en cara la falta de documentación al respecto de los campos mencionados y de algunas de las opciones de formato que no resultan excesivamente obvias.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '78e6968d-a9bc-4584-a509-ae06835a660f') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Multi KPI</strong> de Microsoft permite presentar un KPI (indicador clave de rendimiento) junto a información adicional que puede resultar de interés.
Una vez instanciada en nuestro lienzo, podemos ver qué campos definen su configuración:
Comencemos llevando el campo <em>Date</em> del calendario de nuestro modelo de datos al campo <em>Date</em> de la visualización. Al campo <em>Values</em> deberemos llevar la métrica cuya evolución en el tiempo queremos analizar. Si se trata de una medida discreta, como el total de ventas por día, la gráfica resultante va a ser poco informativa:
Es por ello que resulta más interesante representar métricas como acumulados en el tiempo, o valores medios, etc. Si definimos, por ejemplo, la medida siguiente para calcular el acumulado de ventas:
Sales running total in Date =
CALCULATE(
[Sales];
FILTER(
ALLSELECTED('Calendar'[Date]);
ISONORAFTER('Calendar'[Date]; MAX('Calendar'[Date]); DESC)
)
)
...y la llevamos a nuestra visualización, el resultado es mucho más útil:
En la visualización se muestra el valor actual de la métrica (3 millones de euros), el incremento que esta cifra representa respecto al dato del primer día (354.33K%) y el número de días representados (1.825).
Moviendo el cursor por encima de la gráfica podemos ver, para la fecha correspondiente, cuál era el valor de la métrica:
En la imagen vemos que el sábado 4 de marzo de 2017 las ventas acumuladas eran de 1M€. Podemos cambiar el formato de los valores (para que se muestren en miles, por ejemplo) en <em>Formato > Values Display Units</em>, aunque esto puede obligarnos a modificar el tamaño de la fuente a usar con los valores. Para la gráfica principal podemos cambiar el tamaño de la fuente del valor representado desactivando la opción <em>Formato > KPI > Auto Font Size</em>, y fijando el tamaño que nos interese en <em>Formato > KPI > Value Font Size</em>. Por supuesto podemos configurar muchas otras características de la fuente. Los tamaños a usar cuando estemos moviendo el cursor por encima de la gráfica son configurables por separado, en <em>Formato > KPI On Hover</em>.
Si llevamos al campo <em>Values</em> de la visualización más de un campo de nuestro modelo de datos, se muestran pequeñas gráficas (<em>sparklines</em>) para éstos -completamente configurables- en la parte inferior de la visualización. Así, si llevamos los campos <em>Units</em> (número de unidades vendidas), <em>Sales</em> (cifra de ventas) y <em>Margin</em> (margen de ventas), la visualización mostrará el aspecto mostrado en la siguiente imagen, mostrándose la cifra de dichas métricas para la fecha sobre la que mantengamos el cursor:
Una opción muy útil: Si movemos el cursor encima de alguna de estas sparklines, pasa a ocupar la posición de la gráfica principal. Para volver al estado inicial, basta con mover el cursor fuera de la visualización.
Los campos <em>Warning State</em> y <em>Change start</em> date no parecen estar siendo considerados (lo estarán, simplemente no consigo ver cómo se aplican).
Visualización sumamente práctica y muy configurable, tal vez solo se le puede echar en cara la falta de documentación al respecto de los campos mencionados y de algunas de las opciones de formato que no resultan excesivamente obvias.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '78e6968d-a9bc-4584-a509-ae06835a660f') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Multi KPI</strong> de Microsoft permite presentar un KPI (indicador clave de rendimiento) junto a información adicional que puede resultar de interés.
Una vez instanciada en nuestro lienzo, podemos ver qué campos definen su configuración:
Comencemos llevando el campo <em>Date</em> del calendario de nuestro modelo de datos al campo <em>Date</em> de la visualización. Al campo <em>Values</em> deberemos llevar la métrica cuya evolución en el tiempo queremos analizar. Si se trata de una medida discreta, como el total de ventas por día, la gráfica resultante va a ser poco informativa:
Es por ello que resulta más interesante representar métricas como acumulados en el tiempo, o valores medios, etc. Si definimos, por ejemplo, la medida siguiente para calcular el acumulado de ventas:
Sales running total in Date =
CALCULATE(
[Sales];
FILTER(
ALLSELECTED('Calendar'[Date]);
ISONORAFTER('Calendar'[Date]; MAX('Calendar'[Date]); DESC)
)
)
...y la llevamos a nuestra visualización, el resultado es mucho más útil:
En la visualización se muestra el valor actual de la métrica (3 millones de euros), el incremento que esta cifra representa respecto al dato del primer día (354.33K%) y el número de días representados (1.825).
Moviendo el cursor por encima de la gráfica podemos ver, para la fecha correspondiente, cuál era el valor de la métrica:
En la imagen vemos que el sábado 4 de marzo de 2017 las ventas acumuladas eran de 1M€. Podemos cambiar el formato de los valores (para que se muestren en miles, por ejemplo) en <em>Formato > Values Display Units</em>, aunque esto puede obligarnos a modificar el tamaño de la fuente a usar con los valores. Para la gráfica principal podemos cambiar el tamaño de la fuente del valor representado desactivando la opción <em>Formato > KPI > Auto Font Size</em>, y fijando el tamaño que nos interese en <em>Formato > KPI > Value Font Size</em>. Por supuesto podemos configurar muchas otras características de la fuente. Los tamaños a usar cuando estemos moviendo el cursor por encima de la gráfica son configurables por separado, en <em>Formato > KPI On Hover</em>.
Si llevamos al campo <em>Values</em> de la visualización más de un campo de nuestro modelo de datos, se muestran pequeñas gráficas (<em>sparklines</em>) para éstos -completamente configurables- en la parte inferior de la visualización. Así, si llevamos los campos <em>Units</em> (número de unidades vendidas), <em>Sales</em> (cifra de ventas) y <em>Margin</em> (margen de ventas), la visualización mostrará el aspecto mostrado en la siguiente imagen, mostrándose la cifra de dichas métricas para la fecha sobre la que mantengamos el cursor:
Una opción muy útil: Si movemos el cursor encima de alguna de estas sparklines, pasa a ocupar la posición de la gráfica principal. Para volver al estado inicial, basta con mover el cursor fuera de la visualización.
Los campos <em>Warning State</em> y <em>Change start</em> date no parecen estar siendo considerados (lo estarán, simplemente no consigo ver cómo se aplican).
Visualización sumamente práctica y muy configurable, tal vez solo se le puede echar en cara la falta de documentación al respecto de los campos mencionados y de algunas de las opciones de formato que no resultan excesivamente obvias.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '237ffa4e-15ec-4415-ab54-14fb61e498ce') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Multi KPI</strong> de Microsoft permite presentar un KPI (indicador clave de rendimiento) junto a información adicional que puede resultar de interés.
Una vez instanciada en nuestro lienzo, podemos ver qué campos definen su configuración:
Comencemos llevando el campo <em>Date</em> del calendario de nuestro modelo de datos al campo <em>Date</em> de la visualización. Al campo <em>Values</em> deberemos llevar la métrica cuya evolución en el tiempo queremos analizar. Si se trata de una medida discreta, como el total de ventas por día, la gráfica resultante va a ser poco informativa:
Es por ello que resulta más interesante representar métricas como acumulados en el tiempo, o valores medios, etc. Si definimos, por ejemplo, la medida siguiente para calcular el acumulado de ventas:
Sales running total in Date =
CALCULATE(
[Sales];
FILTER(
ALLSELECTED('Calendar'[Date]);
ISONORAFTER('Calendar'[Date]; MAX('Calendar'[Date]); DESC)
)
)
...y la llevamos a nuestra visualización, el resultado es mucho más útil:
En la visualización se muestra el valor actual de la métrica (3 millones de euros), el incremento que esta cifra representa respecto al dato del primer día (354.33K%) y el número de días representados (1.825).
Moviendo el cursor por encima de la gráfica podemos ver, para la fecha correspondiente, cuál era el valor de la métrica:
En la imagen vemos que el sábado 4 de marzo de 2017 las ventas acumuladas eran de 1M€. Podemos cambiar el formato de los valores (para que se muestren en miles, por ejemplo) en <em>Formato > Values Display Units</em>, aunque esto puede obligarnos a modificar el tamaño de la fuente a usar con los valores. Para la gráfica principal podemos cambiar el tamaño de la fuente del valor representado desactivando la opción <em>Formato > KPI > Auto Font Size</em>, y fijando el tamaño que nos interese en <em>Formato > KPI > Value Font Size</em>. Por supuesto podemos configurar muchas otras características de la fuente. Los tamaños a usar cuando estemos moviendo el cursor por encima de la gráfica son configurables por separado, en <em>Formato > KPI On Hover</em>.
Si llevamos al campo <em>Values</em> de la visualización más de un campo de nuestro modelo de datos, se muestran pequeñas gráficas (<em>sparklines</em>) para éstos -completamente configurables- en la parte inferior de la visualización. Así, si llevamos los campos <em>Units</em> (número de unidades vendidas), <em>Sales</em> (cifra de ventas) y <em>Margin</em> (margen de ventas), la visualización mostrará el aspecto mostrado en la siguiente imagen, mostrándose la cifra de dichas métricas para la fecha sobre la que mantengamos el cursor:
Una opción muy útil: Si movemos el cursor encima de alguna de estas sparklines, pasa a ocupar la posición de la gráfica principal. Para volver al estado inicial, basta con mover el cursor fuera de la visualización.
Los campos <em>Warning State</em> y <em>Change start</em> date no parecen estar siendo considerados (lo estarán, simplemente no consigo ver cómo se aplican).
Visualización sumamente práctica y muy configurable, tal vez solo se le puede echar en cara la falta de documentación al respecto de los campos mencionados y de algunas de las opciones de formato que no resultan excesivamente obvias.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '237ffa4e-15ec-4415-ab54-14fb61e498ce') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Multi KPI</strong> de Microsoft permite presentar un KPI (indicador clave de rendimiento) junto a información adicional que puede resultar de interés.
Una vez instanciada en nuestro lienzo, podemos ver qué campos definen su configuración:
Comencemos llevando el campo <em>Date</em> del calendario de nuestro modelo de datos al campo <em>Date</em> de la visualización. Al campo <em>Values</em> deberemos llevar la métrica cuya evolución en el tiempo queremos analizar. Si se trata de una medida discreta, como el total de ventas por día, la gráfica resultante va a ser poco informativa:
Es por ello que resulta más interesante representar métricas como acumulados en el tiempo, o valores medios, etc. Si definimos, por ejemplo, la medida siguiente para calcular el acumulado de ventas:
Sales running total in Date =
CALCULATE(
[Sales];
FILTER(
ALLSELECTED('Calendar'[Date]);
ISONORAFTER('Calendar'[Date]; MAX('Calendar'[Date]); DESC)
)
)
...y la llevamos a nuestra visualización, el resultado es mucho más útil:
En la visualización se muestra el valor actual de la métrica (3 millones de euros), el incremento que esta cifra representa respecto al dato del primer día (354.33K%) y el número de días representados (1.825).
Moviendo el cursor por encima de la gráfica podemos ver, para la fecha correspondiente, cuál era el valor de la métrica:
En la imagen vemos que el sábado 4 de marzo de 2017 las ventas acumuladas eran de 1M€. Podemos cambiar el formato de los valores (para que se muestren en miles, por ejemplo) en <em>Formato > Values Display Units</em>, aunque esto puede obligarnos a modificar el tamaño de la fuente a usar con los valores. Para la gráfica principal podemos cambiar el tamaño de la fuente del valor representado desactivando la opción <em>Formato > KPI > Auto Font Size</em>, y fijando el tamaño que nos interese en <em>Formato > KPI > Value Font Size</em>. Por supuesto podemos configurar muchas otras características de la fuente. Los tamaños a usar cuando estemos moviendo el cursor por encima de la gráfica son configurables por separado, en <em>Formato > KPI On Hover</em>.
Si llevamos al campo <em>Values</em> de la visualización más de un campo de nuestro modelo de datos, se muestran pequeñas gráficas (<em>sparklines</em>) para éstos -completamente configurables- en la parte inferior de la visualización. Así, si llevamos los campos <em>Units</em> (número de unidades vendidas), <em>Sales</em> (cifra de ventas) y <em>Margin</em> (margen de ventas), la visualización mostrará el aspecto mostrado en la siguiente imagen, mostrándose la cifra de dichas métricas para la fecha sobre la que mantengamos el cursor:
Una opción muy útil: Si movemos el cursor encima de alguna de estas sparklines, pasa a ocupar la posición de la gráfica principal. Para volver al estado inicial, basta con mover el cursor fuera de la visualización.
Los campos <em>Warning State</em> y <em>Change start</em> date no parecen estar siendo considerados (lo estarán, simplemente no consigo ver cómo se aplican).
Visualización sumamente práctica y muy configurable, tal vez solo se le puede echar en cara la falta de documentación al respecto de los campos mencionados y de algunas de las opciones de formato que no resultan excesivamente obvias.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('file_load_multiple') (Line: 696)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->buildQuery(Array) (Line: 422)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->getFromStorage(Array) (Line: 393)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->doLoadMultiple(Array) (Line: 346)
Drupal\Core\Entity\EntityStorageBase->loadMultiple(Array) (Line: 641)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '237ffa4e-15ec-4415-ab54-14fb61e498ce') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Multi KPI</strong> de Microsoft permite presentar un KPI (indicador clave de rendimiento) junto a información adicional que puede resultar de interés.
Una vez instanciada en nuestro lienzo, podemos ver qué campos definen su configuración:
Comencemos llevando el campo <em>Date</em> del calendario de nuestro modelo de datos al campo <em>Date</em> de la visualización. Al campo <em>Values</em> deberemos llevar la métrica cuya evolución en el tiempo queremos analizar. Si se trata de una medida discreta, como el total de ventas por día, la gráfica resultante va a ser poco informativa:
Es por ello que resulta más interesante representar métricas como acumulados en el tiempo, o valores medios, etc. Si definimos, por ejemplo, la medida siguiente para calcular el acumulado de ventas:
Sales running total in Date =
CALCULATE(
[Sales];
FILTER(
ALLSELECTED('Calendar'[Date]);
ISONORAFTER('Calendar'[Date]; MAX('Calendar'[Date]); DESC)
)
)
...y la llevamos a nuestra visualización, el resultado es mucho más útil:
En la visualización se muestra el valor actual de la métrica (3 millones de euros), el incremento que esta cifra representa respecto al dato del primer día (354.33K%) y el número de días representados (1.825).
Moviendo el cursor por encima de la gráfica podemos ver, para la fecha correspondiente, cuál era el valor de la métrica:
En la imagen vemos que el sábado 4 de marzo de 2017 las ventas acumuladas eran de 1M€. Podemos cambiar el formato de los valores (para que se muestren en miles, por ejemplo) en <em>Formato > Values Display Units</em>, aunque esto puede obligarnos a modificar el tamaño de la fuente a usar con los valores. Para la gráfica principal podemos cambiar el tamaño de la fuente del valor representado desactivando la opción <em>Formato > KPI > Auto Font Size</em>, y fijando el tamaño que nos interese en <em>Formato > KPI > Value Font Size</em>. Por supuesto podemos configurar muchas otras características de la fuente. Los tamaños a usar cuando estemos moviendo el cursor por encima de la gráfica son configurables por separado, en <em>Formato > KPI On Hover</em>.
Si llevamos al campo <em>Values</em> de la visualización más de un campo de nuestro modelo de datos, se muestran pequeñas gráficas (<em>sparklines</em>) para éstos -completamente configurables- en la parte inferior de la visualización. Así, si llevamos los campos <em>Units</em> (número de unidades vendidas), <em>Sales</em> (cifra de ventas) y <em>Margin</em> (margen de ventas), la visualización mostrará el aspecto mostrado en la siguiente imagen, mostrándose la cifra de dichas métricas para la fecha sobre la que mantengamos el cursor:
Una opción muy útil: Si movemos el cursor encima de alguna de estas sparklines, pasa a ocupar la posición de la gráfica principal. Para volver al estado inicial, basta con mover el cursor fuera de la visualización.
Los campos <em>Warning State</em> y <em>Change start</em> date no parecen estar siendo considerados (lo estarán, simplemente no consigo ver cómo se aplican).
Visualización sumamente práctica y muy configurable, tal vez solo se le puede echar en cara la falta de documentación al respecto de los campos mencionados y de algunas de las opciones de formato que no resultan excesivamente obvias.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '237ffa4e-15ec-4415-ab54-14fb61e498ce') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Multi KPI</strong> de Microsoft permite presentar un KPI (indicador clave de rendimiento) junto a información adicional que puede resultar de interés.
Una vez instanciada en nuestro lienzo, podemos ver qué campos definen su configuración:
Comencemos llevando el campo <em>Date</em> del calendario de nuestro modelo de datos al campo <em>Date</em> de la visualización. Al campo <em>Values</em> deberemos llevar la métrica cuya evolución en el tiempo queremos analizar. Si se trata de una medida discreta, como el total de ventas por día, la gráfica resultante va a ser poco informativa:
Es por ello que resulta más interesante representar métricas como acumulados en el tiempo, o valores medios, etc. Si definimos, por ejemplo, la medida siguiente para calcular el acumulado de ventas:
Sales running total in Date =
CALCULATE(
[Sales];
FILTER(
ALLSELECTED('Calendar'[Date]);
ISONORAFTER('Calendar'[Date]; MAX('Calendar'[Date]); DESC)
)
)
...y la llevamos a nuestra visualización, el resultado es mucho más útil:
En la visualización se muestra el valor actual de la métrica (3 millones de euros), el incremento que esta cifra representa respecto al dato del primer día (354.33K%) y el número de días representados (1.825).
Moviendo el cursor por encima de la gráfica podemos ver, para la fecha correspondiente, cuál era el valor de la métrica:
En la imagen vemos que el sábado 4 de marzo de 2017 las ventas acumuladas eran de 1M€. Podemos cambiar el formato de los valores (para que se muestren en miles, por ejemplo) en <em>Formato > Values Display Units</em>, aunque esto puede obligarnos a modificar el tamaño de la fuente a usar con los valores. Para la gráfica principal podemos cambiar el tamaño de la fuente del valor representado desactivando la opción <em>Formato > KPI > Auto Font Size</em>, y fijando el tamaño que nos interese en <em>Formato > KPI > Value Font Size</em>. Por supuesto podemos configurar muchas otras características de la fuente. Los tamaños a usar cuando estemos moviendo el cursor por encima de la gráfica son configurables por separado, en <em>Formato > KPI On Hover</em>.
Si llevamos al campo <em>Values</em> de la visualización más de un campo de nuestro modelo de datos, se muestran pequeñas gráficas (<em>sparklines</em>) para éstos -completamente configurables- en la parte inferior de la visualización. Así, si llevamos los campos <em>Units</em> (número de unidades vendidas), <em>Sales</em> (cifra de ventas) y <em>Margin</em> (margen de ventas), la visualización mostrará el aspecto mostrado en la siguiente imagen, mostrándose la cifra de dichas métricas para la fecha sobre la que mantengamos el cursor:
Una opción muy útil: Si movemos el cursor encima de alguna de estas sparklines, pasa a ocupar la posición de la gráfica principal. Para volver al estado inicial, basta con mover el cursor fuera de la visualización.
Los campos <em>Warning State</em> y <em>Change start</em> date no parecen estar siendo considerados (lo estarán, simplemente no consigo ver cómo se aplican).
Visualización sumamente práctica y muy configurable, tal vez solo se le puede echar en cara la falta de documentación al respecto de los campos mencionados y de algunas de las opciones de formato que no resultan excesivamente obvias.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '237ffa4e-15ec-4415-ab54-14fb61e498ce') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Multi KPI</strong> de Microsoft permite presentar un KPI (indicador clave de rendimiento) junto a información adicional que puede resultar de interés.
Una vez instanciada en nuestro lienzo, podemos ver qué campos definen su configuración:
Comencemos llevando el campo <em>Date</em> del calendario de nuestro modelo de datos al campo <em>Date</em> de la visualización. Al campo <em>Values</em> deberemos llevar la métrica cuya evolución en el tiempo queremos analizar. Si se trata de una medida discreta, como el total de ventas por día, la gráfica resultante va a ser poco informativa:
Es por ello que resulta más interesante representar métricas como acumulados en el tiempo, o valores medios, etc. Si definimos, por ejemplo, la medida siguiente para calcular el acumulado de ventas:
Sales running total in Date =
CALCULATE(
[Sales];
FILTER(
ALLSELECTED('Calendar'[Date]);
ISONORAFTER('Calendar'[Date]; MAX('Calendar'[Date]); DESC)
)
)
...y la llevamos a nuestra visualización, el resultado es mucho más útil:
En la visualización se muestra el valor actual de la métrica (3 millones de euros), el incremento que esta cifra representa respecto al dato del primer día (354.33K%) y el número de días representados (1.825).
Moviendo el cursor por encima de la gráfica podemos ver, para la fecha correspondiente, cuál era el valor de la métrica:
En la imagen vemos que el sábado 4 de marzo de 2017 las ventas acumuladas eran de 1M€. Podemos cambiar el formato de los valores (para que se muestren en miles, por ejemplo) en <em>Formato > Values Display Units</em>, aunque esto puede obligarnos a modificar el tamaño de la fuente a usar con los valores. Para la gráfica principal podemos cambiar el tamaño de la fuente del valor representado desactivando la opción <em>Formato > KPI > Auto Font Size</em>, y fijando el tamaño que nos interese en <em>Formato > KPI > Value Font Size</em>. Por supuesto podemos configurar muchas otras características de la fuente. Los tamaños a usar cuando estemos moviendo el cursor por encima de la gráfica son configurables por separado, en <em>Formato > KPI On Hover</em>.
Si llevamos al campo <em>Values</em> de la visualización más de un campo de nuestro modelo de datos, se muestran pequeñas gráficas (<em>sparklines</em>) para éstos -completamente configurables- en la parte inferior de la visualización. Así, si llevamos los campos <em>Units</em> (número de unidades vendidas), <em>Sales</em> (cifra de ventas) y <em>Margin</em> (margen de ventas), la visualización mostrará el aspecto mostrado en la siguiente imagen, mostrándose la cifra de dichas métricas para la fecha sobre la que mantengamos el cursor:
Una opción muy útil: Si movemos el cursor encima de alguna de estas sparklines, pasa a ocupar la posición de la gráfica principal. Para volver al estado inicial, basta con mover el cursor fuera de la visualización.
Los campos <em>Warning State</em> y <em>Change start</em> date no parecen estar siendo considerados (lo estarán, simplemente no consigo ver cómo se aplican).
Visualización sumamente práctica y muy configurable, tal vez solo se le puede echar en cara la falta de documentación al respecto de los campos mencionados y de algunas de las opciones de formato que no resultan excesivamente obvias.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'c150cdcd-2cab-46d5-9225-e22442deedd8') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'c150cdcd-2cab-46d5-9225-e22442deedd8') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('file_load_multiple') (Line: 696)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->buildQuery(Array) (Line: 422)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->getFromStorage(Array) (Line: 393)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->doLoadMultiple(Array) (Line: 346)
Drupal\Core\Entity\EntityStorageBase->loadMultiple(Array) (Line: 641)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'c150cdcd-2cab-46d5-9225-e22442deedd8') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'c150cdcd-2cab-46d5-9225-e22442deedd8') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'c150cdcd-2cab-46d5-9225-e22442deedd8') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '9c87924a-f094-48f8-b551-30f8fd402e28') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '9c87924a-f094-48f8-b551-30f8fd402e28') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('file_load_multiple') (Line: 696)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->buildQuery(Array) (Line: 422)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->getFromStorage(Array) (Line: 393)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->doLoadMultiple(Array) (Line: 346)
Drupal\Core\Entity\EntityStorageBase->loadMultiple(Array) (Line: 641)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '9c87924a-f094-48f8-b551-30f8fd402e28') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '9c87924a-f094-48f8-b551-30f8fd402e28') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '9c87924a-f094-48f8-b551-30f8fd402e28') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '0f95784f-71a3-4f76-99cc-79b70cff766a') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '0f95784f-71a3-4f76-99cc-79b70cff766a') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('file_load_multiple') (Line: 696)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->buildQuery(Array) (Line: 422)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->getFromStorage(Array) (Line: 393)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->doLoadMultiple(Array) (Line: 346)
Drupal\Core\Entity\EntityStorageBase->loadMultiple(Array) (Line: 641)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '0f95784f-71a3-4f76-99cc-79b70cff766a') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '0f95784f-71a3-4f76-99cc-79b70cff766a') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '0f95784f-71a3-4f76-99cc-79b70cff766a') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '5acbd221-133f-40a8-bf27-70c559cd6206') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '5acbd221-133f-40a8-bf27-70c559cd6206') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('file_load_multiple') (Line: 696)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->buildQuery(Array) (Line: 422)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->getFromStorage(Array) (Line: 393)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->doLoadMultiple(Array) (Line: 346)
Drupal\Core\Entity\EntityStorageBase->loadMultiple(Array) (Line: 641)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '5acbd221-133f-40a8-bf27-70c559cd6206') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '5acbd221-133f-40a8-bf27-70c559cd6206') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '5acbd221-133f-40a8-bf27-70c559cd6206') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '4bf8ba46-380e-4b24-86c2-abb097d794c2') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '4bf8ba46-380e-4b24-86c2-abb097d794c2') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('file_load_multiple') (Line: 696)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->buildQuery(Array) (Line: 422)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->getFromStorage(Array) (Line: 393)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->doLoadMultiple(Array) (Line: 346)
Drupal\Core\Entity\EntityStorageBase->loadMultiple(Array) (Line: 641)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '4bf8ba46-380e-4b24-86c2-abb097d794c2') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '4bf8ba46-380e-4b24-86c2-abb097d794c2') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '4bf8ba46-380e-4b24-86c2-abb097d794c2') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'bfb7a225-76e2-4b01-83e0-b189606af97f') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'bfb7a225-76e2-4b01-83e0-b189606af97f') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('file_load_multiple') (Line: 696)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->buildQuery(Array) (Line: 422)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->getFromStorage(Array) (Line: 393)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->doLoadMultiple(Array) (Line: 346)
Drupal\Core\Entity\EntityStorageBase->loadMultiple(Array) (Line: 641)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'bfb7a225-76e2-4b01-83e0-b189606af97f') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'bfb7a225-76e2-4b01-83e0-b189606af97f') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'bfb7a225-76e2-4b01-83e0-b189606af97f') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '1bb663e9-0764-47ac-ba09-2d078f5d4d6b') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '1bb663e9-0764-47ac-ba09-2d078f5d4d6b') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('file_load_multiple') (Line: 696)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->buildQuery(Array) (Line: 422)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->getFromStorage(Array) (Line: 393)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->doLoadMultiple(Array) (Line: 346)
Drupal\Core\Entity\EntityStorageBase->loadMultiple(Array) (Line: 641)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '1bb663e9-0764-47ac-ba09-2d078f5d4d6b') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '1bb663e9-0764-47ac-ba09-2d078f5d4d6b') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '1bb663e9-0764-47ac-ba09-2d078f5d4d6b') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '69abf18e-c7c5-4538-be99-9e73e7859b0f') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '69abf18e-c7c5-4538-be99-9e73e7859b0f') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('file_load_multiple') (Line: 696)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->buildQuery(Array) (Line: 422)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->getFromStorage(Array) (Line: 393)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->doLoadMultiple(Array) (Line: 346)
Drupal\Core\Entity\EntityStorageBase->loadMultiple(Array) (Line: 641)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '69abf18e-c7c5-4538-be99-9e73e7859b0f') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '69abf18e-c7c5-4538-be99-9e73e7859b0f') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '69abf18e-c7c5-4538-be99-9e73e7859b0f') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '3a83bf56-f7fe-47ae-98bd-213f92b3899e') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '3a83bf56-f7fe-47ae-98bd-213f92b3899e') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('file_load_multiple') (Line: 696)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->buildQuery(Array) (Line: 422)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->getFromStorage(Array) (Line: 393)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->doLoadMultiple(Array) (Line: 346)
Drupal\Core\Entity\EntityStorageBase->loadMultiple(Array) (Line: 641)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '3a83bf56-f7fe-47ae-98bd-213f92b3899e') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '3a83bf56-f7fe-47ae-98bd-213f92b3899e') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '3a83bf56-f7fe-47ae-98bd-213f92b3899e') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '79727987-392a-4c40-8d53-77dc448506e8') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '79727987-392a-4c40-8d53-77dc448506e8') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('file_load_multiple') (Line: 696)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->buildQuery(Array) (Line: 422)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->getFromStorage(Array) (Line: 393)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->doLoadMultiple(Array) (Line: 346)
Drupal\Core\Entity\EntityStorageBase->loadMultiple(Array) (Line: 641)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '79727987-392a-4c40-8d53-77dc448506e8') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '79727987-392a-4c40-8d53-77dc448506e8') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '79727987-392a-4c40-8d53-77dc448506e8') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>).
Los campos de la visualización son los siguientes:
Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla.
Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>:
El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado.
Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica.
Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco:
Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento:
Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación).
El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo):
Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>:
Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado.
Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999).
Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma:
Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia:
El resultado de aplicar la anterior configuración es el siguiente:
El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica.
En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '17c0c94a-8b26-41a3-8028-49a2a1615fcf') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Scatter Chart</strong> (o <strong>gráfico de dispersión</strong> en español) es una versátil visualización integrada en Power BI que, como indica su nombre, permite crear gráficos de dispersión. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos.
En su versión más sencilla, basta con arrastrar sendos campos a los ejes X e Y (pueden ser tanto campos como medidas, y tanto campos cuantitativos como categóricos) y, si el campo llevado al eje X no es categórico, llevar un campo de nuestro modelo de datos al campo de detalles de la visualización. Por ejemplo, en la siguiente imagen se está mostrando las categorías de productos por ventas totales y margen medio:
Esta es la configuración de la visualización:
Es posible mostrar u ocultar las etiquetas en <em>Formato > Etiquetas de categoría</em>, donde también podremos especificar su color, tamaño, fuente y color de fondo. Podemos aplicar un color discreto a las burbujas en <em>Formato > Colores de datos</em>. Este color puede ser común a todas las burbujas o puede ser especificado para cada una de ellas:
Podemos añadir una dimensión adicional llevando un campo de nuestro modelo de datos al campo <em>Leyenda</em> de la visualización. Si éste campo es el mismo que hemos llevado al campo <em>Detalles</em> de la visualización, simplemente estaremos aplicando un color diferente a cada burbuja (y mostrando la leyenda asociada). Si, por el contrario, se trata de un nuevo campo, cada una de las burbujas originales se desagregará según esta nueva dimensión. Por ejemplo, en la siguiente imagen, tras inhabilitar los colores personalizados que habíamos aplicado (en <em>Formato > Colores de datos</em>) llevamos el campo <em>Gender</em> (con información sobre el sexo de los clientes) al mencionado campo <em>Leyenda</em>:
Podemos configurar las burbujas para que su tamaño sea proporcional al valor de otra métrica. Si, por ejemplo, llevamos la medida <em>Units</em> (que suma el número de unidades vendidas) al campo Tamaño de la visualización, ésta mostraría el siguiente aspecto:
Si, como en este caso, las burbujas son demasiado grandes para poder interactuar con ellas cómodamente, es posible aplicar un factor de aumento/reducción en <em>Formato > Formas > Tamaño</em>. Por defecto este valor es 0, aumentándolo estaremos aumentando también el tamaño de las burbujas. Disminuyéndolo, las haremos menores:
El resultado es el siguiente:
Si movemos el cursor encima de una de las burbujas se muestra una ventana flotante con la información asociada a la burbuja, tal y como cabría esperar:
Y aunque no lo hemos comentado, podemos arrastrar al campo <em>Detalles</em> más de un campo para formar una jerarquía, permitiéndonos la visualización navegar por ella. En la siguiente imagen se han llevado los campos <em>Category</em> y <em>Subcategory</em> (campos de nuestro modelo de datos) al campo <em>Detalles</em> y se ha bajado hasta el nivel de <em>Subcategory</em>. Obsérvense los típicos iconos de Power BI en la parte superior de la visualización permitiéndonos movernos por la jerarquía:
También podemos llevar a la visualización (al campo <em>Eje de reproducción</em>) un campo que sirva para "reproducir" los datos a lo largo de una nueva dimensión (típicamente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>. Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09_0.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca.
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
Es de destacar que cuando se configura la visualización con un eje de reproducción resulta muy lenta respondiendo a cambios en su configuración, tamaño, etc.
Y comentar para terminar un par de limitaciones de esta visualización: no es posible modificar la transparencia de las burbujas y, tal y como se puede ver en las anteriores imágenes, en ocasiones las burbujas quedan tan cerca del borde que no se muestran completas. Es posible configurar los límites a mostrar en ambos ejes, pero sería preferible que este ajuste fuese automático.
Buena visualización, en general, y muy configurable y versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '17c0c94a-8b26-41a3-8028-49a2a1615fcf') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Scatter Chart</strong> (o <strong>gráfico de dispersión</strong> en español) es una versátil visualización integrada en Power BI que, como indica su nombre, permite crear gráficos de dispersión. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos.
En su versión más sencilla, basta con arrastrar sendos campos a los ejes X e Y (pueden ser tanto campos como medidas, y tanto campos cuantitativos como categóricos) y, si el campo llevado al eje X no es categórico, llevar un campo de nuestro modelo de datos al campo de detalles de la visualización. Por ejemplo, en la siguiente imagen se está mostrando las categorías de productos por ventas totales y margen medio:
Esta es la configuración de la visualización:
Es posible mostrar u ocultar las etiquetas en <em>Formato > Etiquetas de categoría</em>, donde también podremos especificar su color, tamaño, fuente y color de fondo. Podemos aplicar un color discreto a las burbujas en <em>Formato > Colores de datos</em>. Este color puede ser común a todas las burbujas o puede ser especificado para cada una de ellas:
Podemos añadir una dimensión adicional llevando un campo de nuestro modelo de datos al campo <em>Leyenda</em> de la visualización. Si éste campo es el mismo que hemos llevado al campo <em>Detalles</em> de la visualización, simplemente estaremos aplicando un color diferente a cada burbuja (y mostrando la leyenda asociada). Si, por el contrario, se trata de un nuevo campo, cada una de las burbujas originales se desagregará según esta nueva dimensión. Por ejemplo, en la siguiente imagen, tras inhabilitar los colores personalizados que habíamos aplicado (en <em>Formato > Colores de datos</em>) llevamos el campo <em>Gender</em> (con información sobre el sexo de los clientes) al mencionado campo <em>Leyenda</em>:
Podemos configurar las burbujas para que su tamaño sea proporcional al valor de otra métrica. Si, por ejemplo, llevamos la medida <em>Units</em> (que suma el número de unidades vendidas) al campo Tamaño de la visualización, ésta mostraría el siguiente aspecto:
Si, como en este caso, las burbujas son demasiado grandes para poder interactuar con ellas cómodamente, es posible aplicar un factor de aumento/reducción en <em>Formato > Formas > Tamaño</em>. Por defecto este valor es 0, aumentándolo estaremos aumentando también el tamaño de las burbujas. Disminuyéndolo, las haremos menores:
El resultado es el siguiente:
Si movemos el cursor encima de una de las burbujas se muestra una ventana flotante con la información asociada a la burbuja, tal y como cabría esperar:
Y aunque no lo hemos comentado, podemos arrastrar al campo <em>Detalles</em> más de un campo para formar una jerarquía, permitiéndonos la visualización navegar por ella. En la siguiente imagen se han llevado los campos <em>Category</em> y <em>Subcategory</em> (campos de nuestro modelo de datos) al campo <em>Detalles</em> y se ha bajado hasta el nivel de <em>Subcategory</em>. Obsérvense los típicos iconos de Power BI en la parte superior de la visualización permitiéndonos movernos por la jerarquía:
También podemos llevar a la visualización (al campo <em>Eje de reproducción</em>) un campo que sirva para "reproducir" los datos a lo largo de una nueva dimensión (típicamente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>. Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09_0.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca.
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
Es de destacar que cuando se configura la visualización con un eje de reproducción resulta muy lenta respondiendo a cambios en su configuración, tamaño, etc.
Y comentar para terminar un par de limitaciones de esta visualización: no es posible modificar la transparencia de las burbujas y, tal y como se puede ver en las anteriores imágenes, en ocasiones las burbujas quedan tan cerca del borde que no se muestran completas. Es posible configurar los límites a mostrar en ambos ejes, pero sería preferible que este ajuste fuese automático.
Buena visualización, en general, y muy configurable y versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '17c0c94a-8b26-41a3-8028-49a2a1615fcf') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Scatter Chart</strong> (o <strong>gráfico de dispersión</strong> en español) es una versátil visualización integrada en Power BI que, como indica su nombre, permite crear gráficos de dispersión. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos.
En su versión más sencilla, basta con arrastrar sendos campos a los ejes X e Y (pueden ser tanto campos como medidas, y tanto campos cuantitativos como categóricos) y, si el campo llevado al eje X no es categórico, llevar un campo de nuestro modelo de datos al campo de detalles de la visualización. Por ejemplo, en la siguiente imagen se está mostrando las categorías de productos por ventas totales y margen medio:
Esta es la configuración de la visualización:
Es posible mostrar u ocultar las etiquetas en <em>Formato > Etiquetas de categoría</em>, donde también podremos especificar su color, tamaño, fuente y color de fondo. Podemos aplicar un color discreto a las burbujas en <em>Formato > Colores de datos</em>. Este color puede ser común a todas las burbujas o puede ser especificado para cada una de ellas:
Podemos añadir una dimensión adicional llevando un campo de nuestro modelo de datos al campo <em>Leyenda</em> de la visualización. Si éste campo es el mismo que hemos llevado al campo <em>Detalles</em> de la visualización, simplemente estaremos aplicando un color diferente a cada burbuja (y mostrando la leyenda asociada). Si, por el contrario, se trata de un nuevo campo, cada una de las burbujas originales se desagregará según esta nueva dimensión. Por ejemplo, en la siguiente imagen, tras inhabilitar los colores personalizados que habíamos aplicado (en <em>Formato > Colores de datos</em>) llevamos el campo <em>Gender</em> (con información sobre el sexo de los clientes) al mencionado campo <em>Leyenda</em>:
Podemos configurar las burbujas para que su tamaño sea proporcional al valor de otra métrica. Si, por ejemplo, llevamos la medida <em>Units</em> (que suma el número de unidades vendidas) al campo Tamaño de la visualización, ésta mostraría el siguiente aspecto:
Si, como en este caso, las burbujas son demasiado grandes para poder interactuar con ellas cómodamente, es posible aplicar un factor de aumento/reducción en <em>Formato > Formas > Tamaño</em>. Por defecto este valor es 0, aumentándolo estaremos aumentando también el tamaño de las burbujas. Disminuyéndolo, las haremos menores:
El resultado es el siguiente:
Si movemos el cursor encima de una de las burbujas se muestra una ventana flotante con la información asociada a la burbuja, tal y como cabría esperar:
Y aunque no lo hemos comentado, podemos arrastrar al campo <em>Detalles</em> más de un campo para formar una jerarquía, permitiéndonos la visualización navegar por ella. En la siguiente imagen se han llevado los campos <em>Category</em> y <em>Subcategory</em> (campos de nuestro modelo de datos) al campo <em>Detalles</em> y se ha bajado hasta el nivel de <em>Subcategory</em>. Obsérvense los típicos iconos de Power BI en la parte superior de la visualización permitiéndonos movernos por la jerarquía:
También podemos llevar a la visualización (al campo <em>Eje de reproducción</em>) un campo que sirva para "reproducir" los datos a lo largo de una nueva dimensión (típicamente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>. Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09_0.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca.
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
Es de destacar que cuando se configura la visualización con un eje de reproducción resulta muy lenta respondiendo a cambios en su configuración, tamaño, etc.
Y comentar para terminar un par de limitaciones de esta visualización: no es posible modificar la transparencia de las burbujas y, tal y como se puede ver en las anteriores imágenes, en ocasiones las burbujas quedan tan cerca del borde que no se muestran completas. Es posible configurar los límites a mostrar en ambos ejes, pero sería preferible que este ajuste fuese automático.
Buena visualización, en general, y muy configurable y versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '17c0c94a-8b26-41a3-8028-49a2a1615fcf') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Scatter Chart</strong> (o <strong>gráfico de dispersión</strong> en español) es una versátil visualización integrada en Power BI que, como indica su nombre, permite crear gráficos de dispersión. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos.
En su versión más sencilla, basta con arrastrar sendos campos a los ejes X e Y (pueden ser tanto campos como medidas, y tanto campos cuantitativos como categóricos) y, si el campo llevado al eje X no es categórico, llevar un campo de nuestro modelo de datos al campo de detalles de la visualización. Por ejemplo, en la siguiente imagen se está mostrando las categorías de productos por ventas totales y margen medio:
Esta es la configuración de la visualización:
Es posible mostrar u ocultar las etiquetas en <em>Formato > Etiquetas de categoría</em>, donde también podremos especificar su color, tamaño, fuente y color de fondo. Podemos aplicar un color discreto a las burbujas en <em>Formato > Colores de datos</em>. Este color puede ser común a todas las burbujas o puede ser especificado para cada una de ellas:
Podemos añadir una dimensión adicional llevando un campo de nuestro modelo de datos al campo <em>Leyenda</em> de la visualización. Si éste campo es el mismo que hemos llevado al campo <em>Detalles</em> de la visualización, simplemente estaremos aplicando un color diferente a cada burbuja (y mostrando la leyenda asociada). Si, por el contrario, se trata de un nuevo campo, cada una de las burbujas originales se desagregará según esta nueva dimensión. Por ejemplo, en la siguiente imagen, tras inhabilitar los colores personalizados que habíamos aplicado (en <em>Formato > Colores de datos</em>) llevamos el campo <em>Gender</em> (con información sobre el sexo de los clientes) al mencionado campo <em>Leyenda</em>:
Podemos configurar las burbujas para que su tamaño sea proporcional al valor de otra métrica. Si, por ejemplo, llevamos la medida <em>Units</em> (que suma el número de unidades vendidas) al campo Tamaño de la visualización, ésta mostraría el siguiente aspecto:
Si, como en este caso, las burbujas son demasiado grandes para poder interactuar con ellas cómodamente, es posible aplicar un factor de aumento/reducción en <em>Formato > Formas > Tamaño</em>. Por defecto este valor es 0, aumentándolo estaremos aumentando también el tamaño de las burbujas. Disminuyéndolo, las haremos menores:
El resultado es el siguiente:
Si movemos el cursor encima de una de las burbujas se muestra una ventana flotante con la información asociada a la burbuja, tal y como cabría esperar:
Y aunque no lo hemos comentado, podemos arrastrar al campo <em>Detalles</em> más de un campo para formar una jerarquía, permitiéndonos la visualización navegar por ella. En la siguiente imagen se han llevado los campos <em>Category</em> y <em>Subcategory</em> (campos de nuestro modelo de datos) al campo <em>Detalles</em> y se ha bajado hasta el nivel de <em>Subcategory</em>. Obsérvense los típicos iconos de Power BI en la parte superior de la visualización permitiéndonos movernos por la jerarquía:
También podemos llevar a la visualización (al campo <em>Eje de reproducción</em>) un campo que sirva para "reproducir" los datos a lo largo de una nueva dimensión (típicamente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>. Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09_0.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca.
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
Es de destacar que cuando se configura la visualización con un eje de reproducción resulta muy lenta respondiendo a cambios en su configuración, tamaño, etc.
Y comentar para terminar un par de limitaciones de esta visualización: no es posible modificar la transparencia de las burbujas y, tal y como se puede ver en las anteriores imágenes, en ocasiones las burbujas quedan tan cerca del borde que no se muestran completas. Es posible configurar los límites a mostrar en ambos ejes, pero sería preferible que este ajuste fuese automático.
Buena visualización, en general, y muy configurable y versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '0f7946a3-8e01-4163-99c3-24f09b5afe26') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Scatter Chart</strong> (o <strong>gráfico de dispersión</strong> en español) es una versátil visualización integrada en Power BI que, como indica su nombre, permite crear gráficos de dispersión. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos.
En su versión más sencilla, basta con arrastrar sendos campos a los ejes X e Y (pueden ser tanto campos como medidas, y tanto campos cuantitativos como categóricos) y, si el campo llevado al eje X no es categórico, llevar un campo de nuestro modelo de datos al campo de detalles de la visualización. Por ejemplo, en la siguiente imagen se está mostrando las categorías de productos por ventas totales y margen medio:
Esta es la configuración de la visualización:
Es posible mostrar u ocultar las etiquetas en <em>Formato > Etiquetas de categoría</em>, donde también podremos especificar su color, tamaño, fuente y color de fondo. Podemos aplicar un color discreto a las burbujas en <em>Formato > Colores de datos</em>. Este color puede ser común a todas las burbujas o puede ser especificado para cada una de ellas:
Podemos añadir una dimensión adicional llevando un campo de nuestro modelo de datos al campo <em>Leyenda</em> de la visualización. Si éste campo es el mismo que hemos llevado al campo <em>Detalles</em> de la visualización, simplemente estaremos aplicando un color diferente a cada burbuja (y mostrando la leyenda asociada). Si, por el contrario, se trata de un nuevo campo, cada una de las burbujas originales se desagregará según esta nueva dimensión. Por ejemplo, en la siguiente imagen, tras inhabilitar los colores personalizados que habíamos aplicado (en <em>Formato > Colores de datos</em>) llevamos el campo <em>Gender</em> (con información sobre el sexo de los clientes) al mencionado campo <em>Leyenda</em>:
Podemos configurar las burbujas para que su tamaño sea proporcional al valor de otra métrica. Si, por ejemplo, llevamos la medida <em>Units</em> (que suma el número de unidades vendidas) al campo Tamaño de la visualización, ésta mostraría el siguiente aspecto:
Si, como en este caso, las burbujas son demasiado grandes para poder interactuar con ellas cómodamente, es posible aplicar un factor de aumento/reducción en <em>Formato > Formas > Tamaño</em>. Por defecto este valor es 0, aumentándolo estaremos aumentando también el tamaño de las burbujas. Disminuyéndolo, las haremos menores:
El resultado es el siguiente:
Si movemos el cursor encima de una de las burbujas se muestra una ventana flotante con la información asociada a la burbuja, tal y como cabría esperar:
Y aunque no lo hemos comentado, podemos arrastrar al campo <em>Detalles</em> más de un campo para formar una jerarquía, permitiéndonos la visualización navegar por ella. En la siguiente imagen se han llevado los campos <em>Category</em> y <em>Subcategory</em> (campos de nuestro modelo de datos) al campo <em>Detalles</em> y se ha bajado hasta el nivel de <em>Subcategory</em>. Obsérvense los típicos iconos de Power BI en la parte superior de la visualización permitiéndonos movernos por la jerarquía:
También podemos llevar a la visualización (al campo <em>Eje de reproducción</em>) un campo que sirva para "reproducir" los datos a lo largo de una nueva dimensión (típicamente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>. Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09_0.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca.
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
Es de destacar que cuando se configura la visualización con un eje de reproducción resulta muy lenta respondiendo a cambios en su configuración, tamaño, etc.
Y comentar para terminar un par de limitaciones de esta visualización: no es posible modificar la transparencia de las burbujas y, tal y como se puede ver en las anteriores imágenes, en ocasiones las burbujas quedan tan cerca del borde que no se muestran completas. Es posible configurar los límites a mostrar en ambos ejes, pero sería preferible que este ajuste fuese automático.
Buena visualización, en general, y muy configurable y versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '0f7946a3-8e01-4163-99c3-24f09b5afe26') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Scatter Chart</strong> (o <strong>gráfico de dispersión</strong> en español) es una versátil visualización integrada en Power BI que, como indica su nombre, permite crear gráficos de dispersión. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos.
En su versión más sencilla, basta con arrastrar sendos campos a los ejes X e Y (pueden ser tanto campos como medidas, y tanto campos cuantitativos como categóricos) y, si el campo llevado al eje X no es categórico, llevar un campo de nuestro modelo de datos al campo de detalles de la visualización. Por ejemplo, en la siguiente imagen se está mostrando las categorías de productos por ventas totales y margen medio:
Esta es la configuración de la visualización:
Es posible mostrar u ocultar las etiquetas en <em>Formato > Etiquetas de categoría</em>, donde también podremos especificar su color, tamaño, fuente y color de fondo. Podemos aplicar un color discreto a las burbujas en <em>Formato > Colores de datos</em>. Este color puede ser común a todas las burbujas o puede ser especificado para cada una de ellas:
Podemos añadir una dimensión adicional llevando un campo de nuestro modelo de datos al campo <em>Leyenda</em> de la visualización. Si éste campo es el mismo que hemos llevado al campo <em>Detalles</em> de la visualización, simplemente estaremos aplicando un color diferente a cada burbuja (y mostrando la leyenda asociada). Si, por el contrario, se trata de un nuevo campo, cada una de las burbujas originales se desagregará según esta nueva dimensión. Por ejemplo, en la siguiente imagen, tras inhabilitar los colores personalizados que habíamos aplicado (en <em>Formato > Colores de datos</em>) llevamos el campo <em>Gender</em> (con información sobre el sexo de los clientes) al mencionado campo <em>Leyenda</em>:
Podemos configurar las burbujas para que su tamaño sea proporcional al valor de otra métrica. Si, por ejemplo, llevamos la medida <em>Units</em> (que suma el número de unidades vendidas) al campo Tamaño de la visualización, ésta mostraría el siguiente aspecto:
Si, como en este caso, las burbujas son demasiado grandes para poder interactuar con ellas cómodamente, es posible aplicar un factor de aumento/reducción en <em>Formato > Formas > Tamaño</em>. Por defecto este valor es 0, aumentándolo estaremos aumentando también el tamaño de las burbujas. Disminuyéndolo, las haremos menores:
El resultado es el siguiente:
Si movemos el cursor encima de una de las burbujas se muestra una ventana flotante con la información asociada a la burbuja, tal y como cabría esperar:
Y aunque no lo hemos comentado, podemos arrastrar al campo <em>Detalles</em> más de un campo para formar una jerarquía, permitiéndonos la visualización navegar por ella. En la siguiente imagen se han llevado los campos <em>Category</em> y <em>Subcategory</em> (campos de nuestro modelo de datos) al campo <em>Detalles</em> y se ha bajado hasta el nivel de <em>Subcategory</em>. Obsérvense los típicos iconos de Power BI en la parte superior de la visualización permitiéndonos movernos por la jerarquía:
También podemos llevar a la visualización (al campo <em>Eje de reproducción</em>) un campo que sirva para "reproducir" los datos a lo largo de una nueva dimensión (típicamente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>. Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09_0.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca.
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
Es de destacar que cuando se configura la visualización con un eje de reproducción resulta muy lenta respondiendo a cambios en su configuración, tamaño, etc.
Y comentar para terminar un par de limitaciones de esta visualización: no es posible modificar la transparencia de las burbujas y, tal y como se puede ver en las anteriores imágenes, en ocasiones las burbujas quedan tan cerca del borde que no se muestran completas. Es posible configurar los límites a mostrar en ambos ejes, pero sería preferible que este ajuste fuese automático.
Buena visualización, en general, y muy configurable y versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '0f7946a3-8e01-4163-99c3-24f09b5afe26') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Scatter Chart</strong> (o <strong>gráfico de dispersión</strong> en español) es una versátil visualización integrada en Power BI que, como indica su nombre, permite crear gráficos de dispersión. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos.
En su versión más sencilla, basta con arrastrar sendos campos a los ejes X e Y (pueden ser tanto campos como medidas, y tanto campos cuantitativos como categóricos) y, si el campo llevado al eje X no es categórico, llevar un campo de nuestro modelo de datos al campo de detalles de la visualización. Por ejemplo, en la siguiente imagen se está mostrando las categorías de productos por ventas totales y margen medio:
Esta es la configuración de la visualización:
Es posible mostrar u ocultar las etiquetas en <em>Formato > Etiquetas de categoría</em>, donde también podremos especificar su color, tamaño, fuente y color de fondo. Podemos aplicar un color discreto a las burbujas en <em>Formato > Colores de datos</em>. Este color puede ser común a todas las burbujas o puede ser especificado para cada una de ellas:
Podemos añadir una dimensión adicional llevando un campo de nuestro modelo de datos al campo <em>Leyenda</em> de la visualización. Si éste campo es el mismo que hemos llevado al campo <em>Detalles</em> de la visualización, simplemente estaremos aplicando un color diferente a cada burbuja (y mostrando la leyenda asociada). Si, por el contrario, se trata de un nuevo campo, cada una de las burbujas originales se desagregará según esta nueva dimensión. Por ejemplo, en la siguiente imagen, tras inhabilitar los colores personalizados que habíamos aplicado (en <em>Formato > Colores de datos</em>) llevamos el campo <em>Gender</em> (con información sobre el sexo de los clientes) al mencionado campo <em>Leyenda</em>:
Podemos configurar las burbujas para que su tamaño sea proporcional al valor de otra métrica. Si, por ejemplo, llevamos la medida <em>Units</em> (que suma el número de unidades vendidas) al campo Tamaño de la visualización, ésta mostraría el siguiente aspecto:
Si, como en este caso, las burbujas son demasiado grandes para poder interactuar con ellas cómodamente, es posible aplicar un factor de aumento/reducción en <em>Formato > Formas > Tamaño</em>. Por defecto este valor es 0, aumentándolo estaremos aumentando también el tamaño de las burbujas. Disminuyéndolo, las haremos menores:
El resultado es el siguiente:
Si movemos el cursor encima de una de las burbujas se muestra una ventana flotante con la información asociada a la burbuja, tal y como cabría esperar:
Y aunque no lo hemos comentado, podemos arrastrar al campo <em>Detalles</em> más de un campo para formar una jerarquía, permitiéndonos la visualización navegar por ella. En la siguiente imagen se han llevado los campos <em>Category</em> y <em>Subcategory</em> (campos de nuestro modelo de datos) al campo <em>Detalles</em> y se ha bajado hasta el nivel de <em>Subcategory</em>. Obsérvense los típicos iconos de Power BI en la parte superior de la visualización permitiéndonos movernos por la jerarquía:
También podemos llevar a la visualización (al campo <em>Eje de reproducción</em>) un campo que sirva para "reproducir" los datos a lo largo de una nueva dimensión (típicamente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>. Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09_0.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca.
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
Es de destacar que cuando se configura la visualización con un eje de reproducción resulta muy lenta respondiendo a cambios en su configuración, tamaño, etc.
Y comentar para terminar un par de limitaciones de esta visualización: no es posible modificar la transparencia de las burbujas y, tal y como se puede ver en las anteriores imágenes, en ocasiones las burbujas quedan tan cerca del borde que no se muestran completas. Es posible configurar los límites a mostrar en ambos ejes, pero sería preferible que este ajuste fuese automático.
Buena visualización, en general, y muy configurable y versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '0f7946a3-8e01-4163-99c3-24f09b5afe26') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Scatter Chart</strong> (o <strong>gráfico de dispersión</strong> en español) es una versátil visualización integrada en Power BI que, como indica su nombre, permite crear gráficos de dispersión. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos.
En su versión más sencilla, basta con arrastrar sendos campos a los ejes X e Y (pueden ser tanto campos como medidas, y tanto campos cuantitativos como categóricos) y, si el campo llevado al eje X no es categórico, llevar un campo de nuestro modelo de datos al campo de detalles de la visualización. Por ejemplo, en la siguiente imagen se está mostrando las categorías de productos por ventas totales y margen medio:
Esta es la configuración de la visualización:
Es posible mostrar u ocultar las etiquetas en <em>Formato > Etiquetas de categoría</em>, donde también podremos especificar su color, tamaño, fuente y color de fondo. Podemos aplicar un color discreto a las burbujas en <em>Formato > Colores de datos</em>. Este color puede ser común a todas las burbujas o puede ser especificado para cada una de ellas:
Podemos añadir una dimensión adicional llevando un campo de nuestro modelo de datos al campo <em>Leyenda</em> de la visualización. Si éste campo es el mismo que hemos llevado al campo <em>Detalles</em> de la visualización, simplemente estaremos aplicando un color diferente a cada burbuja (y mostrando la leyenda asociada). Si, por el contrario, se trata de un nuevo campo, cada una de las burbujas originales se desagregará según esta nueva dimensión. Por ejemplo, en la siguiente imagen, tras inhabilitar los colores personalizados que habíamos aplicado (en <em>Formato > Colores de datos</em>) llevamos el campo <em>Gender</em> (con información sobre el sexo de los clientes) al mencionado campo <em>Leyenda</em>:
Podemos configurar las burbujas para que su tamaño sea proporcional al valor de otra métrica. Si, por ejemplo, llevamos la medida <em>Units</em> (que suma el número de unidades vendidas) al campo Tamaño de la visualización, ésta mostraría el siguiente aspecto:
Si, como en este caso, las burbujas son demasiado grandes para poder interactuar con ellas cómodamente, es posible aplicar un factor de aumento/reducción en <em>Formato > Formas > Tamaño</em>. Por defecto este valor es 0, aumentándolo estaremos aumentando también el tamaño de las burbujas. Disminuyéndolo, las haremos menores:
El resultado es el siguiente:
Si movemos el cursor encima de una de las burbujas se muestra una ventana flotante con la información asociada a la burbuja, tal y como cabría esperar:
Y aunque no lo hemos comentado, podemos arrastrar al campo <em>Detalles</em> más de un campo para formar una jerarquía, permitiéndonos la visualización navegar por ella. En la siguiente imagen se han llevado los campos <em>Category</em> y <em>Subcategory</em> (campos de nuestro modelo de datos) al campo <em>Detalles</em> y se ha bajado hasta el nivel de <em>Subcategory</em>. Obsérvense los típicos iconos de Power BI en la parte superior de la visualización permitiéndonos movernos por la jerarquía:
También podemos llevar a la visualización (al campo <em>Eje de reproducción</em>) un campo que sirva para "reproducir" los datos a lo largo de una nueva dimensión (típicamente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>. Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09_0.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca.
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
Es de destacar que cuando se configura la visualización con un eje de reproducción resulta muy lenta respondiendo a cambios en su configuración, tamaño, etc.
Y comentar para terminar un par de limitaciones de esta visualización: no es posible modificar la transparencia de las burbujas y, tal y como se puede ver en las anteriores imágenes, en ocasiones las burbujas quedan tan cerca del borde que no se muestran completas. Es posible configurar los límites a mostrar en ambos ejes, pero sería preferible que este ajuste fuese automático.
Buena visualización, en general, y muy configurable y versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '2107f0e8-1ed1-488a-a295-d98cb877d5b2') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Scatter Chart</strong> (o <strong>gráfico de dispersión</strong> en español) es una versátil visualización integrada en Power BI que, como indica su nombre, permite crear gráficos de dispersión. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos.
En su versión más sencilla, basta con arrastrar sendos campos a los ejes X e Y (pueden ser tanto campos como medidas, y tanto campos cuantitativos como categóricos) y, si el campo llevado al eje X no es categórico, llevar un campo de nuestro modelo de datos al campo de detalles de la visualización. Por ejemplo, en la siguiente imagen se está mostrando las categorías de productos por ventas totales y margen medio:
Esta es la configuración de la visualización:
Es posible mostrar u ocultar las etiquetas en <em>Formato > Etiquetas de categoría</em>, donde también podremos especificar su color, tamaño, fuente y color de fondo. Podemos aplicar un color discreto a las burbujas en <em>Formato > Colores de datos</em>. Este color puede ser común a todas las burbujas o puede ser especificado para cada una de ellas:
Podemos añadir una dimensión adicional llevando un campo de nuestro modelo de datos al campo <em>Leyenda</em> de la visualización. Si éste campo es el mismo que hemos llevado al campo <em>Detalles</em> de la visualización, simplemente estaremos aplicando un color diferente a cada burbuja (y mostrando la leyenda asociada). Si, por el contrario, se trata de un nuevo campo, cada una de las burbujas originales se desagregará según esta nueva dimensión. Por ejemplo, en la siguiente imagen, tras inhabilitar los colores personalizados que habíamos aplicado (en <em>Formato > Colores de datos</em>) llevamos el campo <em>Gender</em> (con información sobre el sexo de los clientes) al mencionado campo <em>Leyenda</em>:
Podemos configurar las burbujas para que su tamaño sea proporcional al valor de otra métrica. Si, por ejemplo, llevamos la medida <em>Units</em> (que suma el número de unidades vendidas) al campo Tamaño de la visualización, ésta mostraría el siguiente aspecto:
Si, como en este caso, las burbujas son demasiado grandes para poder interactuar con ellas cómodamente, es posible aplicar un factor de aumento/reducción en <em>Formato > Formas > Tamaño</em>. Por defecto este valor es 0, aumentándolo estaremos aumentando también el tamaño de las burbujas. Disminuyéndolo, las haremos menores:
El resultado es el siguiente:
Si movemos el cursor encima de una de las burbujas se muestra una ventana flotante con la información asociada a la burbuja, tal y como cabría esperar:
Y aunque no lo hemos comentado, podemos arrastrar al campo <em>Detalles</em> más de un campo para formar una jerarquía, permitiéndonos la visualización navegar por ella. En la siguiente imagen se han llevado los campos <em>Category</em> y <em>Subcategory</em> (campos de nuestro modelo de datos) al campo <em>Detalles</em> y se ha bajado hasta el nivel de <em>Subcategory</em>. Obsérvense los típicos iconos de Power BI en la parte superior de la visualización permitiéndonos movernos por la jerarquía:
También podemos llevar a la visualización (al campo <em>Eje de reproducción</em>) un campo que sirva para "reproducir" los datos a lo largo de una nueva dimensión (típicamente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>. Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09_0.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca.
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
Es de destacar que cuando se configura la visualización con un eje de reproducción resulta muy lenta respondiendo a cambios en su configuración, tamaño, etc.
Y comentar para terminar un par de limitaciones de esta visualización: no es posible modificar la transparencia de las burbujas y, tal y como se puede ver en las anteriores imágenes, en ocasiones las burbujas quedan tan cerca del borde que no se muestran completas. Es posible configurar los límites a mostrar en ambos ejes, pero sería preferible que este ajuste fuese automático.
Buena visualización, en general, y muy configurable y versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '2107f0e8-1ed1-488a-a295-d98cb877d5b2') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Scatter Chart</strong> (o <strong>gráfico de dispersión</strong> en español) es una versátil visualización integrada en Power BI que, como indica su nombre, permite crear gráficos de dispersión. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos.
En su versión más sencilla, basta con arrastrar sendos campos a los ejes X e Y (pueden ser tanto campos como medidas, y tanto campos cuantitativos como categóricos) y, si el campo llevado al eje X no es categórico, llevar un campo de nuestro modelo de datos al campo de detalles de la visualización. Por ejemplo, en la siguiente imagen se está mostrando las categorías de productos por ventas totales y margen medio:
Esta es la configuración de la visualización:
Es posible mostrar u ocultar las etiquetas en <em>Formato > Etiquetas de categoría</em>, donde también podremos especificar su color, tamaño, fuente y color de fondo. Podemos aplicar un color discreto a las burbujas en <em>Formato > Colores de datos</em>. Este color puede ser común a todas las burbujas o puede ser especificado para cada una de ellas:
Podemos añadir una dimensión adicional llevando un campo de nuestro modelo de datos al campo <em>Leyenda</em> de la visualización. Si éste campo es el mismo que hemos llevado al campo <em>Detalles</em> de la visualización, simplemente estaremos aplicando un color diferente a cada burbuja (y mostrando la leyenda asociada). Si, por el contrario, se trata de un nuevo campo, cada una de las burbujas originales se desagregará según esta nueva dimensión. Por ejemplo, en la siguiente imagen, tras inhabilitar los colores personalizados que habíamos aplicado (en <em>Formato > Colores de datos</em>) llevamos el campo <em>Gender</em> (con información sobre el sexo de los clientes) al mencionado campo <em>Leyenda</em>:
Podemos configurar las burbujas para que su tamaño sea proporcional al valor de otra métrica. Si, por ejemplo, llevamos la medida <em>Units</em> (que suma el número de unidades vendidas) al campo Tamaño de la visualización, ésta mostraría el siguiente aspecto:
Si, como en este caso, las burbujas son demasiado grandes para poder interactuar con ellas cómodamente, es posible aplicar un factor de aumento/reducción en <em>Formato > Formas > Tamaño</em>. Por defecto este valor es 0, aumentándolo estaremos aumentando también el tamaño de las burbujas. Disminuyéndolo, las haremos menores:
El resultado es el siguiente:
Si movemos el cursor encima de una de las burbujas se muestra una ventana flotante con la información asociada a la burbuja, tal y como cabría esperar:
Y aunque no lo hemos comentado, podemos arrastrar al campo <em>Detalles</em> más de un campo para formar una jerarquía, permitiéndonos la visualización navegar por ella. En la siguiente imagen se han llevado los campos <em>Category</em> y <em>Subcategory</em> (campos de nuestro modelo de datos) al campo <em>Detalles</em> y se ha bajado hasta el nivel de <em>Subcategory</em>. Obsérvense los típicos iconos de Power BI en la parte superior de la visualización permitiéndonos movernos por la jerarquía:
También podemos llevar a la visualización (al campo <em>Eje de reproducción</em>) un campo que sirva para "reproducir" los datos a lo largo de una nueva dimensión (típicamente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>. Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09_0.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca.
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
Es de destacar que cuando se configura la visualización con un eje de reproducción resulta muy lenta respondiendo a cambios en su configuración, tamaño, etc.
Y comentar para terminar un par de limitaciones de esta visualización: no es posible modificar la transparencia de las burbujas y, tal y como se puede ver en las anteriores imágenes, en ocasiones las burbujas quedan tan cerca del borde que no se muestran completas. Es posible configurar los límites a mostrar en ambos ejes, pero sería preferible que este ajuste fuese automático.
Buena visualización, en general, y muy configurable y versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '2107f0e8-1ed1-488a-a295-d98cb877d5b2') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Scatter Chart</strong> (o <strong>gráfico de dispersión</strong> en español) es una versátil visualización integrada en Power BI que, como indica su nombre, permite crear gráficos de dispersión. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos.
En su versión más sencilla, basta con arrastrar sendos campos a los ejes X e Y (pueden ser tanto campos como medidas, y tanto campos cuantitativos como categóricos) y, si el campo llevado al eje X no es categórico, llevar un campo de nuestro modelo de datos al campo de detalles de la visualización. Por ejemplo, en la siguiente imagen se está mostrando las categorías de productos por ventas totales y margen medio:
Esta es la configuración de la visualización:
Es posible mostrar u ocultar las etiquetas en <em>Formato > Etiquetas de categoría</em>, donde también podremos especificar su color, tamaño, fuente y color de fondo. Podemos aplicar un color discreto a las burbujas en <em>Formato > Colores de datos</em>. Este color puede ser común a todas las burbujas o puede ser especificado para cada una de ellas:
Podemos añadir una dimensión adicional llevando un campo de nuestro modelo de datos al campo <em>Leyenda</em> de la visualización. Si éste campo es el mismo que hemos llevado al campo <em>Detalles</em> de la visualización, simplemente estaremos aplicando un color diferente a cada burbuja (y mostrando la leyenda asociada). Si, por el contrario, se trata de un nuevo campo, cada una de las burbujas originales se desagregará según esta nueva dimensión. Por ejemplo, en la siguiente imagen, tras inhabilitar los colores personalizados que habíamos aplicado (en <em>Formato > Colores de datos</em>) llevamos el campo <em>Gender</em> (con información sobre el sexo de los clientes) al mencionado campo <em>Leyenda</em>:
Podemos configurar las burbujas para que su tamaño sea proporcional al valor de otra métrica. Si, por ejemplo, llevamos la medida <em>Units</em> (que suma el número de unidades vendidas) al campo Tamaño de la visualización, ésta mostraría el siguiente aspecto:
Si, como en este caso, las burbujas son demasiado grandes para poder interactuar con ellas cómodamente, es posible aplicar un factor de aumento/reducción en <em>Formato > Formas > Tamaño</em>. Por defecto este valor es 0, aumentándolo estaremos aumentando también el tamaño de las burbujas. Disminuyéndolo, las haremos menores:
El resultado es el siguiente:
Si movemos el cursor encima de una de las burbujas se muestra una ventana flotante con la información asociada a la burbuja, tal y como cabría esperar:
Y aunque no lo hemos comentado, podemos arrastrar al campo <em>Detalles</em> más de un campo para formar una jerarquía, permitiéndonos la visualización navegar por ella. En la siguiente imagen se han llevado los campos <em>Category</em> y <em>Subcategory</em> (campos de nuestro modelo de datos) al campo <em>Detalles</em> y se ha bajado hasta el nivel de <em>Subcategory</em>. Obsérvense los típicos iconos de Power BI en la parte superior de la visualización permitiéndonos movernos por la jerarquía:
También podemos llevar a la visualización (al campo <em>Eje de reproducción</em>) un campo que sirva para "reproducir" los datos a lo largo de una nueva dimensión (típicamente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>. Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09_0.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca.
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
Es de destacar que cuando se configura la visualización con un eje de reproducción resulta muy lenta respondiendo a cambios en su configuración, tamaño, etc.
Y comentar para terminar un par de limitaciones de esta visualización: no es posible modificar la transparencia de las burbujas y, tal y como se puede ver en las anteriores imágenes, en ocasiones las burbujas quedan tan cerca del borde que no se muestran completas. Es posible configurar los límites a mostrar en ambos ejes, pero sería preferible que este ajuste fuese automático.
Buena visualización, en general, y muy configurable y versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '2107f0e8-1ed1-488a-a295-d98cb877d5b2') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Scatter Chart</strong> (o <strong>gráfico de dispersión</strong> en español) es una versátil visualización integrada en Power BI que, como indica su nombre, permite crear gráficos de dispersión. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos.
En su versión más sencilla, basta con arrastrar sendos campos a los ejes X e Y (pueden ser tanto campos como medidas, y tanto campos cuantitativos como categóricos) y, si el campo llevado al eje X no es categórico, llevar un campo de nuestro modelo de datos al campo de detalles de la visualización. Por ejemplo, en la siguiente imagen se está mostrando las categorías de productos por ventas totales y margen medio:
Esta es la configuración de la visualización:
Es posible mostrar u ocultar las etiquetas en <em>Formato > Etiquetas de categoría</em>, donde también podremos especificar su color, tamaño, fuente y color de fondo. Podemos aplicar un color discreto a las burbujas en <em>Formato > Colores de datos</em>. Este color puede ser común a todas las burbujas o puede ser especificado para cada una de ellas:
Podemos añadir una dimensión adicional llevando un campo de nuestro modelo de datos al campo <em>Leyenda</em> de la visualización. Si éste campo es el mismo que hemos llevado al campo <em>Detalles</em> de la visualización, simplemente estaremos aplicando un color diferente a cada burbuja (y mostrando la leyenda asociada). Si, por el contrario, se trata de un nuevo campo, cada una de las burbujas originales se desagregará según esta nueva dimensión. Por ejemplo, en la siguiente imagen, tras inhabilitar los colores personalizados que habíamos aplicado (en <em>Formato > Colores de datos</em>) llevamos el campo <em>Gender</em> (con información sobre el sexo de los clientes) al mencionado campo <em>Leyenda</em>:
Podemos configurar las burbujas para que su tamaño sea proporcional al valor de otra métrica. Si, por ejemplo, llevamos la medida <em>Units</em> (que suma el número de unidades vendidas) al campo Tamaño de la visualización, ésta mostraría el siguiente aspecto:
Si, como en este caso, las burbujas son demasiado grandes para poder interactuar con ellas cómodamente, es posible aplicar un factor de aumento/reducción en <em>Formato > Formas > Tamaño</em>. Por defecto este valor es 0, aumentándolo estaremos aumentando también el tamaño de las burbujas. Disminuyéndolo, las haremos menores:
El resultado es el siguiente:
Si movemos el cursor encima de una de las burbujas se muestra una ventana flotante con la información asociada a la burbuja, tal y como cabría esperar:
Y aunque no lo hemos comentado, podemos arrastrar al campo <em>Detalles</em> más de un campo para formar una jerarquía, permitiéndonos la visualización navegar por ella. En la siguiente imagen se han llevado los campos <em>Category</em> y <em>Subcategory</em> (campos de nuestro modelo de datos) al campo <em>Detalles</em> y se ha bajado hasta el nivel de <em>Subcategory</em>. Obsérvense los típicos iconos de Power BI en la parte superior de la visualización permitiéndonos movernos por la jerarquía:
También podemos llevar a la visualización (al campo <em>Eje de reproducción</em>) un campo que sirva para "reproducir" los datos a lo largo de una nueva dimensión (típicamente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>. Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09_0.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca.
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
Es de destacar que cuando se configura la visualización con un eje de reproducción resulta muy lenta respondiendo a cambios en su configuración, tamaño, etc.
Y comentar para terminar un par de limitaciones de esta visualización: no es posible modificar la transparencia de las burbujas y, tal y como se puede ver en las anteriores imágenes, en ocasiones las burbujas quedan tan cerca del borde que no se muestran completas. Es posible configurar los límites a mostrar en ambos ejes, pero sería preferible que este ajuste fuese automático.
Buena visualización, en general, y muy configurable y versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'cb1760ef-57e1-4c7f-95af-c002c42d3869') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Scatter Chart</strong> (o <strong>gráfico de dispersión</strong> en español) es una versátil visualización integrada en Power BI que, como indica su nombre, permite crear gráficos de dispersión. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos.
En su versión más sencilla, basta con arrastrar sendos campos a los ejes X e Y (pueden ser tanto campos como medidas, y tanto campos cuantitativos como categóricos) y, si el campo llevado al eje X no es categórico, llevar un campo de nuestro modelo de datos al campo de detalles de la visualización. Por ejemplo, en la siguiente imagen se está mostrando las categorías de productos por ventas totales y margen medio:
Esta es la configuración de la visualización:
Es posible mostrar u ocultar las etiquetas en <em>Formato > Etiquetas de categoría</em>, donde también podremos especificar su color, tamaño, fuente y color de fondo. Podemos aplicar un color discreto a las burbujas en <em>Formato > Colores de datos</em>. Este color puede ser común a todas las burbujas o puede ser especificado para cada una de ellas:
Podemos añadir una dimensión adicional llevando un campo de nuestro modelo de datos al campo <em>Leyenda</em> de la visualización. Si éste campo es el mismo que hemos llevado al campo <em>Detalles</em> de la visualización, simplemente estaremos aplicando un color diferente a cada burbuja (y mostrando la leyenda asociada). Si, por el contrario, se trata de un nuevo campo, cada una de las burbujas originales se desagregará según esta nueva dimensión. Por ejemplo, en la siguiente imagen, tras inhabilitar los colores personalizados que habíamos aplicado (en <em>Formato > Colores de datos</em>) llevamos el campo <em>Gender</em> (con información sobre el sexo de los clientes) al mencionado campo <em>Leyenda</em>:
Podemos configurar las burbujas para que su tamaño sea proporcional al valor de otra métrica. Si, por ejemplo, llevamos la medida <em>Units</em> (que suma el número de unidades vendidas) al campo Tamaño de la visualización, ésta mostraría el siguiente aspecto:
Si, como en este caso, las burbujas son demasiado grandes para poder interactuar con ellas cómodamente, es posible aplicar un factor de aumento/reducción en <em>Formato > Formas > Tamaño</em>. Por defecto este valor es 0, aumentándolo estaremos aumentando también el tamaño de las burbujas. Disminuyéndolo, las haremos menores:
El resultado es el siguiente:
Si movemos el cursor encima de una de las burbujas se muestra una ventana flotante con la información asociada a la burbuja, tal y como cabría esperar:
Y aunque no lo hemos comentado, podemos arrastrar al campo <em>Detalles</em> más de un campo para formar una jerarquía, permitiéndonos la visualización navegar por ella. En la siguiente imagen se han llevado los campos <em>Category</em> y <em>Subcategory</em> (campos de nuestro modelo de datos) al campo <em>Detalles</em> y se ha bajado hasta el nivel de <em>Subcategory</em>. Obsérvense los típicos iconos de Power BI en la parte superior de la visualización permitiéndonos movernos por la jerarquía:
También podemos llevar a la visualización (al campo <em>Eje de reproducción</em>) un campo que sirva para "reproducir" los datos a lo largo de una nueva dimensión (típicamente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>. Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09_0.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca.
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
Es de destacar que cuando se configura la visualización con un eje de reproducción resulta muy lenta respondiendo a cambios en su configuración, tamaño, etc.
Y comentar para terminar un par de limitaciones de esta visualización: no es posible modificar la transparencia de las burbujas y, tal y como se puede ver en las anteriores imágenes, en ocasiones las burbujas quedan tan cerca del borde que no se muestran completas. Es posible configurar los límites a mostrar en ambos ejes, pero sería preferible que este ajuste fuese automático.
Buena visualización, en general, y muy configurable y versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'cb1760ef-57e1-4c7f-95af-c002c42d3869') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Scatter Chart</strong> (o <strong>gráfico de dispersión</strong> en español) es una versátil visualización integrada en Power BI que, como indica su nombre, permite crear gráficos de dispersión. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos.
En su versión más sencilla, basta con arrastrar sendos campos a los ejes X e Y (pueden ser tanto campos como medidas, y tanto campos cuantitativos como categóricos) y, si el campo llevado al eje X no es categórico, llevar un campo de nuestro modelo de datos al campo de detalles de la visualización. Por ejemplo, en la siguiente imagen se está mostrando las categorías de productos por ventas totales y margen medio:
Esta es la configuración de la visualización:
Es posible mostrar u ocultar las etiquetas en <em>Formato > Etiquetas de categoría</em>, donde también podremos especificar su color, tamaño, fuente y color de fondo. Podemos aplicar un color discreto a las burbujas en <em>Formato > Colores de datos</em>. Este color puede ser común a todas las burbujas o puede ser especificado para cada una de ellas:
Podemos añadir una dimensión adicional llevando un campo de nuestro modelo de datos al campo <em>Leyenda</em> de la visualización. Si éste campo es el mismo que hemos llevado al campo <em>Detalles</em> de la visualización, simplemente estaremos aplicando un color diferente a cada burbuja (y mostrando la leyenda asociada). Si, por el contrario, se trata de un nuevo campo, cada una de las burbujas originales se desagregará según esta nueva dimensión. Por ejemplo, en la siguiente imagen, tras inhabilitar los colores personalizados que habíamos aplicado (en <em>Formato > Colores de datos</em>) llevamos el campo <em>Gender</em> (con información sobre el sexo de los clientes) al mencionado campo <em>Leyenda</em>:
Podemos configurar las burbujas para que su tamaño sea proporcional al valor de otra métrica. Si, por ejemplo, llevamos la medida <em>Units</em> (que suma el número de unidades vendidas) al campo Tamaño de la visualización, ésta mostraría el siguiente aspecto:
Si, como en este caso, las burbujas son demasiado grandes para poder interactuar con ellas cómodamente, es posible aplicar un factor de aumento/reducción en <em>Formato > Formas > Tamaño</em>. Por defecto este valor es 0, aumentándolo estaremos aumentando también el tamaño de las burbujas. Disminuyéndolo, las haremos menores:
El resultado es el siguiente:
Si movemos el cursor encima de una de las burbujas se muestra una ventana flotante con la información asociada a la burbuja, tal y como cabría esperar:
Y aunque no lo hemos comentado, podemos arrastrar al campo <em>Detalles</em> más de un campo para formar una jerarquía, permitiéndonos la visualización navegar por ella. En la siguiente imagen se han llevado los campos <em>Category</em> y <em>Subcategory</em> (campos de nuestro modelo de datos) al campo <em>Detalles</em> y se ha bajado hasta el nivel de <em>Subcategory</em>. Obsérvense los típicos iconos de Power BI en la parte superior de la visualización permitiéndonos movernos por la jerarquía:
También podemos llevar a la visualización (al campo <em>Eje de reproducción</em>) un campo que sirva para "reproducir" los datos a lo largo de una nueva dimensión (típicamente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>. Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09_0.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca.
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
Es de destacar que cuando se configura la visualización con un eje de reproducción resulta muy lenta respondiendo a cambios en su configuración, tamaño, etc.
Y comentar para terminar un par de limitaciones de esta visualización: no es posible modificar la transparencia de las burbujas y, tal y como se puede ver en las anteriores imágenes, en ocasiones las burbujas quedan tan cerca del borde que no se muestran completas. Es posible configurar los límites a mostrar en ambos ejes, pero sería preferible que este ajuste fuese automático.
Buena visualización, en general, y muy configurable y versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'cb1760ef-57e1-4c7f-95af-c002c42d3869') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Scatter Chart</strong> (o <strong>gráfico de dispersión</strong> en español) es una versátil visualización integrada en Power BI que, como indica su nombre, permite crear gráficos de dispersión. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos.
En su versión más sencilla, basta con arrastrar sendos campos a los ejes X e Y (pueden ser tanto campos como medidas, y tanto campos cuantitativos como categóricos) y, si el campo llevado al eje X no es categórico, llevar un campo de nuestro modelo de datos al campo de detalles de la visualización. Por ejemplo, en la siguiente imagen se está mostrando las categorías de productos por ventas totales y margen medio:
Esta es la configuración de la visualización:
Es posible mostrar u ocultar las etiquetas en <em>Formato > Etiquetas de categoría</em>, donde también podremos especificar su color, tamaño, fuente y color de fondo. Podemos aplicar un color discreto a las burbujas en <em>Formato > Colores de datos</em>. Este color puede ser común a todas las burbujas o puede ser especificado para cada una de ellas:
Podemos añadir una dimensión adicional llevando un campo de nuestro modelo de datos al campo <em>Leyenda</em> de la visualización. Si éste campo es el mismo que hemos llevado al campo <em>Detalles</em> de la visualización, simplemente estaremos aplicando un color diferente a cada burbuja (y mostrando la leyenda asociada). Si, por el contrario, se trata de un nuevo campo, cada una de las burbujas originales se desagregará según esta nueva dimensión. Por ejemplo, en la siguiente imagen, tras inhabilitar los colores personalizados que habíamos aplicado (en <em>Formato > Colores de datos</em>) llevamos el campo <em>Gender</em> (con información sobre el sexo de los clientes) al mencionado campo <em>Leyenda</em>:
Podemos configurar las burbujas para que su tamaño sea proporcional al valor de otra métrica. Si, por ejemplo, llevamos la medida <em>Units</em> (que suma el número de unidades vendidas) al campo Tamaño de la visualización, ésta mostraría el siguiente aspecto:
Si, como en este caso, las burbujas son demasiado grandes para poder interactuar con ellas cómodamente, es posible aplicar un factor de aumento/reducción en <em>Formato > Formas > Tamaño</em>. Por defecto este valor es 0, aumentándolo estaremos aumentando también el tamaño de las burbujas. Disminuyéndolo, las haremos menores:
El resultado es el siguiente:
Si movemos el cursor encima de una de las burbujas se muestra una ventana flotante con la información asociada a la burbuja, tal y como cabría esperar:
Y aunque no lo hemos comentado, podemos arrastrar al campo <em>Detalles</em> más de un campo para formar una jerarquía, permitiéndonos la visualización navegar por ella. En la siguiente imagen se han llevado los campos <em>Category</em> y <em>Subcategory</em> (campos de nuestro modelo de datos) al campo <em>Detalles</em> y se ha bajado hasta el nivel de <em>Subcategory</em>. Obsérvense los típicos iconos de Power BI en la parte superior de la visualización permitiéndonos movernos por la jerarquía:
También podemos llevar a la visualización (al campo <em>Eje de reproducción</em>) un campo que sirva para "reproducir" los datos a lo largo de una nueva dimensión (típicamente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>. Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09_0.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca.
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
Es de destacar que cuando se configura la visualización con un eje de reproducción resulta muy lenta respondiendo a cambios en su configuración, tamaño, etc.
Y comentar para terminar un par de limitaciones de esta visualización: no es posible modificar la transparencia de las burbujas y, tal y como se puede ver en las anteriores imágenes, en ocasiones las burbujas quedan tan cerca del borde que no se muestran completas. Es posible configurar los límites a mostrar en ambos ejes, pero sería preferible que este ajuste fuese automático.
Buena visualización, en general, y muy configurable y versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'cb1760ef-57e1-4c7f-95af-c002c42d3869') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Scatter Chart</strong> (o <strong>gráfico de dispersión</strong> en español) es una versátil visualización integrada en Power BI que, como indica su nombre, permite crear gráficos de dispersión. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos.
En su versión más sencilla, basta con arrastrar sendos campos a los ejes X e Y (pueden ser tanto campos como medidas, y tanto campos cuantitativos como categóricos) y, si el campo llevado al eje X no es categórico, llevar un campo de nuestro modelo de datos al campo de detalles de la visualización. Por ejemplo, en la siguiente imagen se está mostrando las categorías de productos por ventas totales y margen medio:
Esta es la configuración de la visualización:
Es posible mostrar u ocultar las etiquetas en <em>Formato > Etiquetas de categoría</em>, donde también podremos especificar su color, tamaño, fuente y color de fondo. Podemos aplicar un color discreto a las burbujas en <em>Formato > Colores de datos</em>. Este color puede ser común a todas las burbujas o puede ser especificado para cada una de ellas:
Podemos añadir una dimensión adicional llevando un campo de nuestro modelo de datos al campo <em>Leyenda</em> de la visualización. Si éste campo es el mismo que hemos llevado al campo <em>Detalles</em> de la visualización, simplemente estaremos aplicando un color diferente a cada burbuja (y mostrando la leyenda asociada). Si, por el contrario, se trata de un nuevo campo, cada una de las burbujas originales se desagregará según esta nueva dimensión. Por ejemplo, en la siguiente imagen, tras inhabilitar los colores personalizados que habíamos aplicado (en <em>Formato > Colores de datos</em>) llevamos el campo <em>Gender</em> (con información sobre el sexo de los clientes) al mencionado campo <em>Leyenda</em>:
Podemos configurar las burbujas para que su tamaño sea proporcional al valor de otra métrica. Si, por ejemplo, llevamos la medida <em>Units</em> (que suma el número de unidades vendidas) al campo Tamaño de la visualización, ésta mostraría el siguiente aspecto:
Si, como en este caso, las burbujas son demasiado grandes para poder interactuar con ellas cómodamente, es posible aplicar un factor de aumento/reducción en <em>Formato > Formas > Tamaño</em>. Por defecto este valor es 0, aumentándolo estaremos aumentando también el tamaño de las burbujas. Disminuyéndolo, las haremos menores:
El resultado es el siguiente:
Si movemos el cursor encima de una de las burbujas se muestra una ventana flotante con la información asociada a la burbuja, tal y como cabría esperar:
Y aunque no lo hemos comentado, podemos arrastrar al campo <em>Detalles</em> más de un campo para formar una jerarquía, permitiéndonos la visualización navegar por ella. En la siguiente imagen se han llevado los campos <em>Category</em> y <em>Subcategory</em> (campos de nuestro modelo de datos) al campo <em>Detalles</em> y se ha bajado hasta el nivel de <em>Subcategory</em>. Obsérvense los típicos iconos de Power BI en la parte superior de la visualización permitiéndonos movernos por la jerarquía:
También podemos llevar a la visualización (al campo <em>Eje de reproducción</em>) un campo que sirva para "reproducir" los datos a lo largo de una nueva dimensión (típicamente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>. Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09_0.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca.
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
Es de destacar que cuando se configura la visualización con un eje de reproducción resulta muy lenta respondiendo a cambios en su configuración, tamaño, etc.
Y comentar para terminar un par de limitaciones de esta visualización: no es posible modificar la transparencia de las burbujas y, tal y como se puede ver en las anteriores imágenes, en ocasiones las burbujas quedan tan cerca del borde que no se muestran completas. Es posible configurar los límites a mostrar en ambos ejes, pero sería preferible que este ajuste fuese automático.
Buena visualización, en general, y muy configurable y versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '12fb0c2d-50c3-4394-ac77-da45652296e9') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Scatter Chart</strong> (o <strong>gráfico de dispersión</strong> en español) es una versátil visualización integrada en Power BI que, como indica su nombre, permite crear gráficos de dispersión. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos.
En su versión más sencilla, basta con arrastrar sendos campos a los ejes X e Y (pueden ser tanto campos como medidas, y tanto campos cuantitativos como categóricos) y, si el campo llevado al eje X no es categórico, llevar un campo de nuestro modelo de datos al campo de detalles de la visualización. Por ejemplo, en la siguiente imagen se está mostrando las categorías de productos por ventas totales y margen medio:
Esta es la configuración de la visualización:
Es posible mostrar u ocultar las etiquetas en <em>Formato > Etiquetas de categoría</em>, donde también podremos especificar su color, tamaño, fuente y color de fondo. Podemos aplicar un color discreto a las burbujas en <em>Formato > Colores de datos</em>. Este color puede ser común a todas las burbujas o puede ser especificado para cada una de ellas:
Podemos añadir una dimensión adicional llevando un campo de nuestro modelo de datos al campo <em>Leyenda</em> de la visualización. Si éste campo es el mismo que hemos llevado al campo <em>Detalles</em> de la visualización, simplemente estaremos aplicando un color diferente a cada burbuja (y mostrando la leyenda asociada). Si, por el contrario, se trata de un nuevo campo, cada una de las burbujas originales se desagregará según esta nueva dimensión. Por ejemplo, en la siguiente imagen, tras inhabilitar los colores personalizados que habíamos aplicado (en <em>Formato > Colores de datos</em>) llevamos el campo <em>Gender</em> (con información sobre el sexo de los clientes) al mencionado campo <em>Leyenda</em>:
Podemos configurar las burbujas para que su tamaño sea proporcional al valor de otra métrica. Si, por ejemplo, llevamos la medida <em>Units</em> (que suma el número de unidades vendidas) al campo Tamaño de la visualización, ésta mostraría el siguiente aspecto:
Si, como en este caso, las burbujas son demasiado grandes para poder interactuar con ellas cómodamente, es posible aplicar un factor de aumento/reducción en <em>Formato > Formas > Tamaño</em>. Por defecto este valor es 0, aumentándolo estaremos aumentando también el tamaño de las burbujas. Disminuyéndolo, las haremos menores:
El resultado es el siguiente:
Si movemos el cursor encima de una de las burbujas se muestra una ventana flotante con la información asociada a la burbuja, tal y como cabría esperar:
Y aunque no lo hemos comentado, podemos arrastrar al campo <em>Detalles</em> más de un campo para formar una jerarquía, permitiéndonos la visualización navegar por ella. En la siguiente imagen se han llevado los campos <em>Category</em> y <em>Subcategory</em> (campos de nuestro modelo de datos) al campo <em>Detalles</em> y se ha bajado hasta el nivel de <em>Subcategory</em>. Obsérvense los típicos iconos de Power BI en la parte superior de la visualización permitiéndonos movernos por la jerarquía:
También podemos llevar a la visualización (al campo <em>Eje de reproducción</em>) un campo que sirva para "reproducir" los datos a lo largo de una nueva dimensión (típicamente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>. Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09_0.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca.
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
Es de destacar que cuando se configura la visualización con un eje de reproducción resulta muy lenta respondiendo a cambios en su configuración, tamaño, etc.
Y comentar para terminar un par de limitaciones de esta visualización: no es posible modificar la transparencia de las burbujas y, tal y como se puede ver en las anteriores imágenes, en ocasiones las burbujas quedan tan cerca del borde que no se muestran completas. Es posible configurar los límites a mostrar en ambos ejes, pero sería preferible que este ajuste fuese automático.
Buena visualización, en general, y muy configurable y versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '12fb0c2d-50c3-4394-ac77-da45652296e9') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Scatter Chart</strong> (o <strong>gráfico de dispersión</strong> en español) es una versátil visualización integrada en Power BI que, como indica su nombre, permite crear gráficos de dispersión. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos.
En su versión más sencilla, basta con arrastrar sendos campos a los ejes X e Y (pueden ser tanto campos como medidas, y tanto campos cuantitativos como categóricos) y, si el campo llevado al eje X no es categórico, llevar un campo de nuestro modelo de datos al campo de detalles de la visualización. Por ejemplo, en la siguiente imagen se está mostrando las categorías de productos por ventas totales y margen medio:
Esta es la configuración de la visualización:
Es posible mostrar u ocultar las etiquetas en <em>Formato > Etiquetas de categoría</em>, donde también podremos especificar su color, tamaño, fuente y color de fondo. Podemos aplicar un color discreto a las burbujas en <em>Formato > Colores de datos</em>. Este color puede ser común a todas las burbujas o puede ser especificado para cada una de ellas:
Podemos añadir una dimensión adicional llevando un campo de nuestro modelo de datos al campo <em>Leyenda</em> de la visualización. Si éste campo es el mismo que hemos llevado al campo <em>Detalles</em> de la visualización, simplemente estaremos aplicando un color diferente a cada burbuja (y mostrando la leyenda asociada). Si, por el contrario, se trata de un nuevo campo, cada una de las burbujas originales se desagregará según esta nueva dimensión. Por ejemplo, en la siguiente imagen, tras inhabilitar los colores personalizados que habíamos aplicado (en <em>Formato > Colores de datos</em>) llevamos el campo <em>Gender</em> (con información sobre el sexo de los clientes) al mencionado campo <em>Leyenda</em>:
Podemos configurar las burbujas para que su tamaño sea proporcional al valor de otra métrica. Si, por ejemplo, llevamos la medida <em>Units</em> (que suma el número de unidades vendidas) al campo Tamaño de la visualización, ésta mostraría el siguiente aspecto:
Si, como en este caso, las burbujas son demasiado grandes para poder interactuar con ellas cómodamente, es posible aplicar un factor de aumento/reducción en <em>Formato > Formas > Tamaño</em>. Por defecto este valor es 0, aumentándolo estaremos aumentando también el tamaño de las burbujas. Disminuyéndolo, las haremos menores:
El resultado es el siguiente:
Si movemos el cursor encima de una de las burbujas se muestra una ventana flotante con la información asociada a la burbuja, tal y como cabría esperar:
Y aunque no lo hemos comentado, podemos arrastrar al campo <em>Detalles</em> más de un campo para formar una jerarquía, permitiéndonos la visualización navegar por ella. En la siguiente imagen se han llevado los campos <em>Category</em> y <em>Subcategory</em> (campos de nuestro modelo de datos) al campo <em>Detalles</em> y se ha bajado hasta el nivel de <em>Subcategory</em>. Obsérvense los típicos iconos de Power BI en la parte superior de la visualización permitiéndonos movernos por la jerarquía:
También podemos llevar a la visualización (al campo <em>Eje de reproducción</em>) un campo que sirva para "reproducir" los datos a lo largo de una nueva dimensión (típicamente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>. Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09_0.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca.
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
Es de destacar que cuando se configura la visualización con un eje de reproducción resulta muy lenta respondiendo a cambios en su configuración, tamaño, etc.
Y comentar para terminar un par de limitaciones de esta visualización: no es posible modificar la transparencia de las burbujas y, tal y como se puede ver en las anteriores imágenes, en ocasiones las burbujas quedan tan cerca del borde que no se muestran completas. Es posible configurar los límites a mostrar en ambos ejes, pero sería preferible que este ajuste fuese automático.
Buena visualización, en general, y muy configurable y versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '12fb0c2d-50c3-4394-ac77-da45652296e9') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Scatter Chart</strong> (o <strong>gráfico de dispersión</strong> en español) es una versátil visualización integrada en Power BI que, como indica su nombre, permite crear gráficos de dispersión. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos.
En su versión más sencilla, basta con arrastrar sendos campos a los ejes X e Y (pueden ser tanto campos como medidas, y tanto campos cuantitativos como categóricos) y, si el campo llevado al eje X no es categórico, llevar un campo de nuestro modelo de datos al campo de detalles de la visualización. Por ejemplo, en la siguiente imagen se está mostrando las categorías de productos por ventas totales y margen medio:
Esta es la configuración de la visualización:
Es posible mostrar u ocultar las etiquetas en <em>Formato > Etiquetas de categoría</em>, donde también podremos especificar su color, tamaño, fuente y color de fondo. Podemos aplicar un color discreto a las burbujas en <em>Formato > Colores de datos</em>. Este color puede ser común a todas las burbujas o puede ser especificado para cada una de ellas:
Podemos añadir una dimensión adicional llevando un campo de nuestro modelo de datos al campo <em>Leyenda</em> de la visualización. Si éste campo es el mismo que hemos llevado al campo <em>Detalles</em> de la visualización, simplemente estaremos aplicando un color diferente a cada burbuja (y mostrando la leyenda asociada). Si, por el contrario, se trata de un nuevo campo, cada una de las burbujas originales se desagregará según esta nueva dimensión. Por ejemplo, en la siguiente imagen, tras inhabilitar los colores personalizados que habíamos aplicado (en <em>Formato > Colores de datos</em>) llevamos el campo <em>Gender</em> (con información sobre el sexo de los clientes) al mencionado campo <em>Leyenda</em>:
Podemos configurar las burbujas para que su tamaño sea proporcional al valor de otra métrica. Si, por ejemplo, llevamos la medida <em>Units</em> (que suma el número de unidades vendidas) al campo Tamaño de la visualización, ésta mostraría el siguiente aspecto:
Si, como en este caso, las burbujas son demasiado grandes para poder interactuar con ellas cómodamente, es posible aplicar un factor de aumento/reducción en <em>Formato > Formas > Tamaño</em>. Por defecto este valor es 0, aumentándolo estaremos aumentando también el tamaño de las burbujas. Disminuyéndolo, las haremos menores:
El resultado es el siguiente:
Si movemos el cursor encima de una de las burbujas se muestra una ventana flotante con la información asociada a la burbuja, tal y como cabría esperar:
Y aunque no lo hemos comentado, podemos arrastrar al campo <em>Detalles</em> más de un campo para formar una jerarquía, permitiéndonos la visualización navegar por ella. En la siguiente imagen se han llevado los campos <em>Category</em> y <em>Subcategory</em> (campos de nuestro modelo de datos) al campo <em>Detalles</em> y se ha bajado hasta el nivel de <em>Subcategory</em>. Obsérvense los típicos iconos de Power BI en la parte superior de la visualización permitiéndonos movernos por la jerarquía:
También podemos llevar a la visualización (al campo <em>Eje de reproducción</em>) un campo que sirva para "reproducir" los datos a lo largo de una nueva dimensión (típicamente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>. Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09_0.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca.
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
Es de destacar que cuando se configura la visualización con un eje de reproducción resulta muy lenta respondiendo a cambios en su configuración, tamaño, etc.
Y comentar para terminar un par de limitaciones de esta visualización: no es posible modificar la transparencia de las burbujas y, tal y como se puede ver en las anteriores imágenes, en ocasiones las burbujas quedan tan cerca del borde que no se muestran completas. Es posible configurar los límites a mostrar en ambos ejes, pero sería preferible que este ajuste fuese automático.
Buena visualización, en general, y muy configurable y versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '12fb0c2d-50c3-4394-ac77-da45652296e9') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Scatter Chart</strong> (o <strong>gráfico de dispersión</strong> en español) es una versátil visualización integrada en Power BI que, como indica su nombre, permite crear gráficos de dispersión. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos.
En su versión más sencilla, basta con arrastrar sendos campos a los ejes X e Y (pueden ser tanto campos como medidas, y tanto campos cuantitativos como categóricos) y, si el campo llevado al eje X no es categórico, llevar un campo de nuestro modelo de datos al campo de detalles de la visualización. Por ejemplo, en la siguiente imagen se está mostrando las categorías de productos por ventas totales y margen medio:
Esta es la configuración de la visualización:
Es posible mostrar u ocultar las etiquetas en <em>Formato > Etiquetas de categoría</em>, donde también podremos especificar su color, tamaño, fuente y color de fondo. Podemos aplicar un color discreto a las burbujas en <em>Formato > Colores de datos</em>. Este color puede ser común a todas las burbujas o puede ser especificado para cada una de ellas:
Podemos añadir una dimensión adicional llevando un campo de nuestro modelo de datos al campo <em>Leyenda</em> de la visualización. Si éste campo es el mismo que hemos llevado al campo <em>Detalles</em> de la visualización, simplemente estaremos aplicando un color diferente a cada burbuja (y mostrando la leyenda asociada). Si, por el contrario, se trata de un nuevo campo, cada una de las burbujas originales se desagregará según esta nueva dimensión. Por ejemplo, en la siguiente imagen, tras inhabilitar los colores personalizados que habíamos aplicado (en <em>Formato > Colores de datos</em>) llevamos el campo <em>Gender</em> (con información sobre el sexo de los clientes) al mencionado campo <em>Leyenda</em>:
Podemos configurar las burbujas para que su tamaño sea proporcional al valor de otra métrica. Si, por ejemplo, llevamos la medida <em>Units</em> (que suma el número de unidades vendidas) al campo Tamaño de la visualización, ésta mostraría el siguiente aspecto:
Si, como en este caso, las burbujas son demasiado grandes para poder interactuar con ellas cómodamente, es posible aplicar un factor de aumento/reducción en <em>Formato > Formas > Tamaño</em>. Por defecto este valor es 0, aumentándolo estaremos aumentando también el tamaño de las burbujas. Disminuyéndolo, las haremos menores:
El resultado es el siguiente:
Si movemos el cursor encima de una de las burbujas se muestra una ventana flotante con la información asociada a la burbuja, tal y como cabría esperar:
Y aunque no lo hemos comentado, podemos arrastrar al campo <em>Detalles</em> más de un campo para formar una jerarquía, permitiéndonos la visualización navegar por ella. En la siguiente imagen se han llevado los campos <em>Category</em> y <em>Subcategory</em> (campos de nuestro modelo de datos) al campo <em>Detalles</em> y se ha bajado hasta el nivel de <em>Subcategory</em>. Obsérvense los típicos iconos de Power BI en la parte superior de la visualización permitiéndonos movernos por la jerarquía:
También podemos llevar a la visualización (al campo <em>Eje de reproducción</em>) un campo que sirva para "reproducir" los datos a lo largo de una nueva dimensión (típicamente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>. Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09_0.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca.
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
Es de destacar que cuando se configura la visualización con un eje de reproducción resulta muy lenta respondiendo a cambios en su configuración, tamaño, etc.
Y comentar para terminar un par de limitaciones de esta visualización: no es posible modificar la transparencia de las burbujas y, tal y como se puede ver en las anteriores imágenes, en ocasiones las burbujas quedan tan cerca del borde que no se muestran completas. Es posible configurar los límites a mostrar en ambos ejes, pero sería preferible que este ajuste fuese automático.
Buena visualización, en general, y muy configurable y versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '75c69e3d-0848-45c9-b49b-084917081fa1') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Scatter Chart</strong> (o <strong>gráfico de dispersión</strong> en español) es una versátil visualización integrada en Power BI que, como indica su nombre, permite crear gráficos de dispersión. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos.
En su versión más sencilla, basta con arrastrar sendos campos a los ejes X e Y (pueden ser tanto campos como medidas, y tanto campos cuantitativos como categóricos) y, si el campo llevado al eje X no es categórico, llevar un campo de nuestro modelo de datos al campo de detalles de la visualización. Por ejemplo, en la siguiente imagen se está mostrando las categorías de productos por ventas totales y margen medio:
Esta es la configuración de la visualización:
Es posible mostrar u ocultar las etiquetas en <em>Formato > Etiquetas de categoría</em>, donde también podremos especificar su color, tamaño, fuente y color de fondo. Podemos aplicar un color discreto a las burbujas en <em>Formato > Colores de datos</em>. Este color puede ser común a todas las burbujas o puede ser especificado para cada una de ellas:
Podemos añadir una dimensión adicional llevando un campo de nuestro modelo de datos al campo <em>Leyenda</em> de la visualización. Si éste campo es el mismo que hemos llevado al campo <em>Detalles</em> de la visualización, simplemente estaremos aplicando un color diferente a cada burbuja (y mostrando la leyenda asociada). Si, por el contrario, se trata de un nuevo campo, cada una de las burbujas originales se desagregará según esta nueva dimensión. Por ejemplo, en la siguiente imagen, tras inhabilitar los colores personalizados que habíamos aplicado (en <em>Formato > Colores de datos</em>) llevamos el campo <em>Gender</em> (con información sobre el sexo de los clientes) al mencionado campo <em>Leyenda</em>:
Podemos configurar las burbujas para que su tamaño sea proporcional al valor de otra métrica. Si, por ejemplo, llevamos la medida <em>Units</em> (que suma el número de unidades vendidas) al campo Tamaño de la visualización, ésta mostraría el siguiente aspecto:
Si, como en este caso, las burbujas son demasiado grandes para poder interactuar con ellas cómodamente, es posible aplicar un factor de aumento/reducción en <em>Formato > Formas > Tamaño</em>. Por defecto este valor es 0, aumentándolo estaremos aumentando también el tamaño de las burbujas. Disminuyéndolo, las haremos menores:
El resultado es el siguiente:
Si movemos el cursor encima de una de las burbujas se muestra una ventana flotante con la información asociada a la burbuja, tal y como cabría esperar:
Y aunque no lo hemos comentado, podemos arrastrar al campo <em>Detalles</em> más de un campo para formar una jerarquía, permitiéndonos la visualización navegar por ella. En la siguiente imagen se han llevado los campos <em>Category</em> y <em>Subcategory</em> (campos de nuestro modelo de datos) al campo <em>Detalles</em> y se ha bajado hasta el nivel de <em>Subcategory</em>. Obsérvense los típicos iconos de Power BI en la parte superior de la visualización permitiéndonos movernos por la jerarquía:
También podemos llevar a la visualización (al campo <em>Eje de reproducción</em>) un campo que sirva para "reproducir" los datos a lo largo de una nueva dimensión (típicamente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>. Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09_0.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca.
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
Es de destacar que cuando se configura la visualización con un eje de reproducción resulta muy lenta respondiendo a cambios en su configuración, tamaño, etc.
Y comentar para terminar un par de limitaciones de esta visualización: no es posible modificar la transparencia de las burbujas y, tal y como se puede ver en las anteriores imágenes, en ocasiones las burbujas quedan tan cerca del borde que no se muestran completas. Es posible configurar los límites a mostrar en ambos ejes, pero sería preferible que este ajuste fuese automático.
Buena visualización, en general, y muy configurable y versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '75c69e3d-0848-45c9-b49b-084917081fa1') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Scatter Chart</strong> (o <strong>gráfico de dispersión</strong> en español) es una versátil visualización integrada en Power BI que, como indica su nombre, permite crear gráficos de dispersión. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos.
En su versión más sencilla, basta con arrastrar sendos campos a los ejes X e Y (pueden ser tanto campos como medidas, y tanto campos cuantitativos como categóricos) y, si el campo llevado al eje X no es categórico, llevar un campo de nuestro modelo de datos al campo de detalles de la visualización. Por ejemplo, en la siguiente imagen se está mostrando las categorías de productos por ventas totales y margen medio:
Esta es la configuración de la visualización:
Es posible mostrar u ocultar las etiquetas en <em>Formato > Etiquetas de categoría</em>, donde también podremos especificar su color, tamaño, fuente y color de fondo. Podemos aplicar un color discreto a las burbujas en <em>Formato > Colores de datos</em>. Este color puede ser común a todas las burbujas o puede ser especificado para cada una de ellas:
Podemos añadir una dimensión adicional llevando un campo de nuestro modelo de datos al campo <em>Leyenda</em> de la visualización. Si éste campo es el mismo que hemos llevado al campo <em>Detalles</em> de la visualización, simplemente estaremos aplicando un color diferente a cada burbuja (y mostrando la leyenda asociada). Si, por el contrario, se trata de un nuevo campo, cada una de las burbujas originales se desagregará según esta nueva dimensión. Por ejemplo, en la siguiente imagen, tras inhabilitar los colores personalizados que habíamos aplicado (en <em>Formato > Colores de datos</em>) llevamos el campo <em>Gender</em> (con información sobre el sexo de los clientes) al mencionado campo <em>Leyenda</em>:
Podemos configurar las burbujas para que su tamaño sea proporcional al valor de otra métrica. Si, por ejemplo, llevamos la medida <em>Units</em> (que suma el número de unidades vendidas) al campo Tamaño de la visualización, ésta mostraría el siguiente aspecto:
Si, como en este caso, las burbujas son demasiado grandes para poder interactuar con ellas cómodamente, es posible aplicar un factor de aumento/reducción en <em>Formato > Formas > Tamaño</em>. Por defecto este valor es 0, aumentándolo estaremos aumentando también el tamaño de las burbujas. Disminuyéndolo, las haremos menores:
El resultado es el siguiente:
Si movemos el cursor encima de una de las burbujas se muestra una ventana flotante con la información asociada a la burbuja, tal y como cabría esperar:
Y aunque no lo hemos comentado, podemos arrastrar al campo <em>Detalles</em> más de un campo para formar una jerarquía, permitiéndonos la visualización navegar por ella. En la siguiente imagen se han llevado los campos <em>Category</em> y <em>Subcategory</em> (campos de nuestro modelo de datos) al campo <em>Detalles</em> y se ha bajado hasta el nivel de <em>Subcategory</em>. Obsérvense los típicos iconos de Power BI en la parte superior de la visualización permitiéndonos movernos por la jerarquía:
También podemos llevar a la visualización (al campo <em>Eje de reproducción</em>) un campo que sirva para "reproducir" los datos a lo largo de una nueva dimensión (típicamente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>. Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09_0.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca.
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
Es de destacar que cuando se configura la visualización con un eje de reproducción resulta muy lenta respondiendo a cambios en su configuración, tamaño, etc.
Y comentar para terminar un par de limitaciones de esta visualización: no es posible modificar la transparencia de las burbujas y, tal y como se puede ver en las anteriores imágenes, en ocasiones las burbujas quedan tan cerca del borde que no se muestran completas. Es posible configurar los límites a mostrar en ambos ejes, pero sería preferible que este ajuste fuese automático.
Buena visualización, en general, y muy configurable y versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '75c69e3d-0848-45c9-b49b-084917081fa1') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Scatter Chart</strong> (o <strong>gráfico de dispersión</strong> en español) es una versátil visualización integrada en Power BI que, como indica su nombre, permite crear gráficos de dispersión. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos.
En su versión más sencilla, basta con arrastrar sendos campos a los ejes X e Y (pueden ser tanto campos como medidas, y tanto campos cuantitativos como categóricos) y, si el campo llevado al eje X no es categórico, llevar un campo de nuestro modelo de datos al campo de detalles de la visualización. Por ejemplo, en la siguiente imagen se está mostrando las categorías de productos por ventas totales y margen medio:
Esta es la configuración de la visualización:
Es posible mostrar u ocultar las etiquetas en <em>Formato > Etiquetas de categoría</em>, donde también podremos especificar su color, tamaño, fuente y color de fondo. Podemos aplicar un color discreto a las burbujas en <em>Formato > Colores de datos</em>. Este color puede ser común a todas las burbujas o puede ser especificado para cada una de ellas:
Podemos añadir una dimensión adicional llevando un campo de nuestro modelo de datos al campo <em>Leyenda</em> de la visualización. Si éste campo es el mismo que hemos llevado al campo <em>Detalles</em> de la visualización, simplemente estaremos aplicando un color diferente a cada burbuja (y mostrando la leyenda asociada). Si, por el contrario, se trata de un nuevo campo, cada una de las burbujas originales se desagregará según esta nueva dimensión. Por ejemplo, en la siguiente imagen, tras inhabilitar los colores personalizados que habíamos aplicado (en <em>Formato > Colores de datos</em>) llevamos el campo <em>Gender</em> (con información sobre el sexo de los clientes) al mencionado campo <em>Leyenda</em>:
Podemos configurar las burbujas para que su tamaño sea proporcional al valor de otra métrica. Si, por ejemplo, llevamos la medida <em>Units</em> (que suma el número de unidades vendidas) al campo Tamaño de la visualización, ésta mostraría el siguiente aspecto:
Si, como en este caso, las burbujas son demasiado grandes para poder interactuar con ellas cómodamente, es posible aplicar un factor de aumento/reducción en <em>Formato > Formas > Tamaño</em>. Por defecto este valor es 0, aumentándolo estaremos aumentando también el tamaño de las burbujas. Disminuyéndolo, las haremos menores:
El resultado es el siguiente:
Si movemos el cursor encima de una de las burbujas se muestra una ventana flotante con la información asociada a la burbuja, tal y como cabría esperar:
Y aunque no lo hemos comentado, podemos arrastrar al campo <em>Detalles</em> más de un campo para formar una jerarquía, permitiéndonos la visualización navegar por ella. En la siguiente imagen se han llevado los campos <em>Category</em> y <em>Subcategory</em> (campos de nuestro modelo de datos) al campo <em>Detalles</em> y se ha bajado hasta el nivel de <em>Subcategory</em>. Obsérvense los típicos iconos de Power BI en la parte superior de la visualización permitiéndonos movernos por la jerarquía:
También podemos llevar a la visualización (al campo <em>Eje de reproducción</em>) un campo que sirva para "reproducir" los datos a lo largo de una nueva dimensión (típicamente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>. Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09_0.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca.
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
Es de destacar que cuando se configura la visualización con un eje de reproducción resulta muy lenta respondiendo a cambios en su configuración, tamaño, etc.
Y comentar para terminar un par de limitaciones de esta visualización: no es posible modificar la transparencia de las burbujas y, tal y como se puede ver en las anteriores imágenes, en ocasiones las burbujas quedan tan cerca del borde que no se muestran completas. Es posible configurar los límites a mostrar en ambos ejes, pero sería preferible que este ajuste fuese automático.
Buena visualización, en general, y muy configurable y versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '75c69e3d-0848-45c9-b49b-084917081fa1') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Scatter Chart</strong> (o <strong>gráfico de dispersión</strong> en español) es una versátil visualización integrada en Power BI que, como indica su nombre, permite crear gráficos de dispersión. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos.
En su versión más sencilla, basta con arrastrar sendos campos a los ejes X e Y (pueden ser tanto campos como medidas, y tanto campos cuantitativos como categóricos) y, si el campo llevado al eje X no es categórico, llevar un campo de nuestro modelo de datos al campo de detalles de la visualización. Por ejemplo, en la siguiente imagen se está mostrando las categorías de productos por ventas totales y margen medio:
Esta es la configuración de la visualización:
Es posible mostrar u ocultar las etiquetas en <em>Formato > Etiquetas de categoría</em>, donde también podremos especificar su color, tamaño, fuente y color de fondo. Podemos aplicar un color discreto a las burbujas en <em>Formato > Colores de datos</em>. Este color puede ser común a todas las burbujas o puede ser especificado para cada una de ellas:
Podemos añadir una dimensión adicional llevando un campo de nuestro modelo de datos al campo <em>Leyenda</em> de la visualización. Si éste campo es el mismo que hemos llevado al campo <em>Detalles</em> de la visualización, simplemente estaremos aplicando un color diferente a cada burbuja (y mostrando la leyenda asociada). Si, por el contrario, se trata de un nuevo campo, cada una de las burbujas originales se desagregará según esta nueva dimensión. Por ejemplo, en la siguiente imagen, tras inhabilitar los colores personalizados que habíamos aplicado (en <em>Formato > Colores de datos</em>) llevamos el campo <em>Gender</em> (con información sobre el sexo de los clientes) al mencionado campo <em>Leyenda</em>:
Podemos configurar las burbujas para que su tamaño sea proporcional al valor de otra métrica. Si, por ejemplo, llevamos la medida <em>Units</em> (que suma el número de unidades vendidas) al campo Tamaño de la visualización, ésta mostraría el siguiente aspecto:
Si, como en este caso, las burbujas son demasiado grandes para poder interactuar con ellas cómodamente, es posible aplicar un factor de aumento/reducción en <em>Formato > Formas > Tamaño</em>. Por defecto este valor es 0, aumentándolo estaremos aumentando también el tamaño de las burbujas. Disminuyéndolo, las haremos menores:
El resultado es el siguiente:
Si movemos el cursor encima de una de las burbujas se muestra una ventana flotante con la información asociada a la burbuja, tal y como cabría esperar:
Y aunque no lo hemos comentado, podemos arrastrar al campo <em>Detalles</em> más de un campo para formar una jerarquía, permitiéndonos la visualización navegar por ella. En la siguiente imagen se han llevado los campos <em>Category</em> y <em>Subcategory</em> (campos de nuestro modelo de datos) al campo <em>Detalles</em> y se ha bajado hasta el nivel de <em>Subcategory</em>. Obsérvense los típicos iconos de Power BI en la parte superior de la visualización permitiéndonos movernos por la jerarquía:
También podemos llevar a la visualización (al campo <em>Eje de reproducción</em>) un campo que sirva para "reproducir" los datos a lo largo de una nueva dimensión (típicamente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>. Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09_0.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca.
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
Es de destacar que cuando se configura la visualización con un eje de reproducción resulta muy lenta respondiendo a cambios en su configuración, tamaño, etc.
Y comentar para terminar un par de limitaciones de esta visualización: no es posible modificar la transparencia de las burbujas y, tal y como se puede ver en las anteriores imágenes, en ocasiones las burbujas quedan tan cerca del borde que no se muestran completas. Es posible configurar los límites a mostrar en ambos ejes, pero sería preferible que este ajuste fuese automático.
Buena visualización, en general, y muy configurable y versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '25ea049b-c0c3-49b5-a712-a3aadbaa2062') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Scatter Chart</strong> (o <strong>gráfico de dispersión</strong> en español) es una versátil visualización integrada en Power BI que, como indica su nombre, permite crear gráficos de dispersión. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos.
En su versión más sencilla, basta con arrastrar sendos campos a los ejes X e Y (pueden ser tanto campos como medidas, y tanto campos cuantitativos como categóricos) y, si el campo llevado al eje X no es categórico, llevar un campo de nuestro modelo de datos al campo de detalles de la visualización. Por ejemplo, en la siguiente imagen se está mostrando las categorías de productos por ventas totales y margen medio:
Esta es la configuración de la visualización:
Es posible mostrar u ocultar las etiquetas en <em>Formato > Etiquetas de categoría</em>, donde también podremos especificar su color, tamaño, fuente y color de fondo. Podemos aplicar un color discreto a las burbujas en <em>Formato > Colores de datos</em>. Este color puede ser común a todas las burbujas o puede ser especificado para cada una de ellas:
Podemos añadir una dimensión adicional llevando un campo de nuestro modelo de datos al campo <em>Leyenda</em> de la visualización. Si éste campo es el mismo que hemos llevado al campo <em>Detalles</em> de la visualización, simplemente estaremos aplicando un color diferente a cada burbuja (y mostrando la leyenda asociada). Si, por el contrario, se trata de un nuevo campo, cada una de las burbujas originales se desagregará según esta nueva dimensión. Por ejemplo, en la siguiente imagen, tras inhabilitar los colores personalizados que habíamos aplicado (en <em>Formato > Colores de datos</em>) llevamos el campo <em>Gender</em> (con información sobre el sexo de los clientes) al mencionado campo <em>Leyenda</em>:
Podemos configurar las burbujas para que su tamaño sea proporcional al valor de otra métrica. Si, por ejemplo, llevamos la medida <em>Units</em> (que suma el número de unidades vendidas) al campo Tamaño de la visualización, ésta mostraría el siguiente aspecto:
Si, como en este caso, las burbujas son demasiado grandes para poder interactuar con ellas cómodamente, es posible aplicar un factor de aumento/reducción en <em>Formato > Formas > Tamaño</em>. Por defecto este valor es 0, aumentándolo estaremos aumentando también el tamaño de las burbujas. Disminuyéndolo, las haremos menores:
El resultado es el siguiente:
Si movemos el cursor encima de una de las burbujas se muestra una ventana flotante con la información asociada a la burbuja, tal y como cabría esperar:
Y aunque no lo hemos comentado, podemos arrastrar al campo <em>Detalles</em> más de un campo para formar una jerarquía, permitiéndonos la visualización navegar por ella. En la siguiente imagen se han llevado los campos <em>Category</em> y <em>Subcategory</em> (campos de nuestro modelo de datos) al campo <em>Detalles</em> y se ha bajado hasta el nivel de <em>Subcategory</em>. Obsérvense los típicos iconos de Power BI en la parte superior de la visualización permitiéndonos movernos por la jerarquía:
También podemos llevar a la visualización (al campo <em>Eje de reproducción</em>) un campo que sirva para "reproducir" los datos a lo largo de una nueva dimensión (típicamente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>. Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09_0.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca.
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
Es de destacar que cuando se configura la visualización con un eje de reproducción resulta muy lenta respondiendo a cambios en su configuración, tamaño, etc.
Y comentar para terminar un par de limitaciones de esta visualización: no es posible modificar la transparencia de las burbujas y, tal y como se puede ver en las anteriores imágenes, en ocasiones las burbujas quedan tan cerca del borde que no se muestran completas. Es posible configurar los límites a mostrar en ambos ejes, pero sería preferible que este ajuste fuese automático.
Buena visualización, en general, y muy configurable y versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '25ea049b-c0c3-49b5-a712-a3aadbaa2062') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Scatter Chart</strong> (o <strong>gráfico de dispersión</strong> en español) es una versátil visualización integrada en Power BI que, como indica su nombre, permite crear gráficos de dispersión. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos.
En su versión más sencilla, basta con arrastrar sendos campos a los ejes X e Y (pueden ser tanto campos como medidas, y tanto campos cuantitativos como categóricos) y, si el campo llevado al eje X no es categórico, llevar un campo de nuestro modelo de datos al campo de detalles de la visualización. Por ejemplo, en la siguiente imagen se está mostrando las categorías de productos por ventas totales y margen medio:
Esta es la configuración de la visualización:
Es posible mostrar u ocultar las etiquetas en <em>Formato > Etiquetas de categoría</em>, donde también podremos especificar su color, tamaño, fuente y color de fondo. Podemos aplicar un color discreto a las burbujas en <em>Formato > Colores de datos</em>. Este color puede ser común a todas las burbujas o puede ser especificado para cada una de ellas:
Podemos añadir una dimensión adicional llevando un campo de nuestro modelo de datos al campo <em>Leyenda</em> de la visualización. Si éste campo es el mismo que hemos llevado al campo <em>Detalles</em> de la visualización, simplemente estaremos aplicando un color diferente a cada burbuja (y mostrando la leyenda asociada). Si, por el contrario, se trata de un nuevo campo, cada una de las burbujas originales se desagregará según esta nueva dimensión. Por ejemplo, en la siguiente imagen, tras inhabilitar los colores personalizados que habíamos aplicado (en <em>Formato > Colores de datos</em>) llevamos el campo <em>Gender</em> (con información sobre el sexo de los clientes) al mencionado campo <em>Leyenda</em>:
Podemos configurar las burbujas para que su tamaño sea proporcional al valor de otra métrica. Si, por ejemplo, llevamos la medida <em>Units</em> (que suma el número de unidades vendidas) al campo Tamaño de la visualización, ésta mostraría el siguiente aspecto:
Si, como en este caso, las burbujas son demasiado grandes para poder interactuar con ellas cómodamente, es posible aplicar un factor de aumento/reducción en <em>Formato > Formas > Tamaño</em>. Por defecto este valor es 0, aumentándolo estaremos aumentando también el tamaño de las burbujas. Disminuyéndolo, las haremos menores:
El resultado es el siguiente:
Si movemos el cursor encima de una de las burbujas se muestra una ventana flotante con la información asociada a la burbuja, tal y como cabría esperar:
Y aunque no lo hemos comentado, podemos arrastrar al campo <em>Detalles</em> más de un campo para formar una jerarquía, permitiéndonos la visualización navegar por ella. En la siguiente imagen se han llevado los campos <em>Category</em> y <em>Subcategory</em> (campos de nuestro modelo de datos) al campo <em>Detalles</em> y se ha bajado hasta el nivel de <em>Subcategory</em>. Obsérvense los típicos iconos de Power BI en la parte superior de la visualización permitiéndonos movernos por la jerarquía:
También podemos llevar a la visualización (al campo <em>Eje de reproducción</em>) un campo que sirva para "reproducir" los datos a lo largo de una nueva dimensión (típicamente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>. Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09_0.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca.
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
Es de destacar que cuando se configura la visualización con un eje de reproducción resulta muy lenta respondiendo a cambios en su configuración, tamaño, etc.
Y comentar para terminar un par de limitaciones de esta visualización: no es posible modificar la transparencia de las burbujas y, tal y como se puede ver en las anteriores imágenes, en ocasiones las burbujas quedan tan cerca del borde que no se muestran completas. Es posible configurar los límites a mostrar en ambos ejes, pero sería preferible que este ajuste fuese automático.
Buena visualización, en general, y muy configurable y versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '25ea049b-c0c3-49b5-a712-a3aadbaa2062') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Scatter Chart</strong> (o <strong>gráfico de dispersión</strong> en español) es una versátil visualización integrada en Power BI que, como indica su nombre, permite crear gráficos de dispersión. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos.
En su versión más sencilla, basta con arrastrar sendos campos a los ejes X e Y (pueden ser tanto campos como medidas, y tanto campos cuantitativos como categóricos) y, si el campo llevado al eje X no es categórico, llevar un campo de nuestro modelo de datos al campo de detalles de la visualización. Por ejemplo, en la siguiente imagen se está mostrando las categorías de productos por ventas totales y margen medio:
Esta es la configuración de la visualización:
Es posible mostrar u ocultar las etiquetas en <em>Formato > Etiquetas de categoría</em>, donde también podremos especificar su color, tamaño, fuente y color de fondo. Podemos aplicar un color discreto a las burbujas en <em>Formato > Colores de datos</em>. Este color puede ser común a todas las burbujas o puede ser especificado para cada una de ellas:
Podemos añadir una dimensión adicional llevando un campo de nuestro modelo de datos al campo <em>Leyenda</em> de la visualización. Si éste campo es el mismo que hemos llevado al campo <em>Detalles</em> de la visualización, simplemente estaremos aplicando un color diferente a cada burbuja (y mostrando la leyenda asociada). Si, por el contrario, se trata de un nuevo campo, cada una de las burbujas originales se desagregará según esta nueva dimensión. Por ejemplo, en la siguiente imagen, tras inhabilitar los colores personalizados que habíamos aplicado (en <em>Formato > Colores de datos</em>) llevamos el campo <em>Gender</em> (con información sobre el sexo de los clientes) al mencionado campo <em>Leyenda</em>:
Podemos configurar las burbujas para que su tamaño sea proporcional al valor de otra métrica. Si, por ejemplo, llevamos la medida <em>Units</em> (que suma el número de unidades vendidas) al campo Tamaño de la visualización, ésta mostraría el siguiente aspecto:
Si, como en este caso, las burbujas son demasiado grandes para poder interactuar con ellas cómodamente, es posible aplicar un factor de aumento/reducción en <em>Formato > Formas > Tamaño</em>. Por defecto este valor es 0, aumentándolo estaremos aumentando también el tamaño de las burbujas. Disminuyéndolo, las haremos menores:
El resultado es el siguiente:
Si movemos el cursor encima de una de las burbujas se muestra una ventana flotante con la información asociada a la burbuja, tal y como cabría esperar:
Y aunque no lo hemos comentado, podemos arrastrar al campo <em>Detalles</em> más de un campo para formar una jerarquía, permitiéndonos la visualización navegar por ella. En la siguiente imagen se han llevado los campos <em>Category</em> y <em>Subcategory</em> (campos de nuestro modelo de datos) al campo <em>Detalles</em> y se ha bajado hasta el nivel de <em>Subcategory</em>. Obsérvense los típicos iconos de Power BI en la parte superior de la visualización permitiéndonos movernos por la jerarquía:
También podemos llevar a la visualización (al campo <em>Eje de reproducción</em>) un campo que sirva para "reproducir" los datos a lo largo de una nueva dimensión (típicamente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>. Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09_0.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca.
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
Es de destacar que cuando se configura la visualización con un eje de reproducción resulta muy lenta respondiendo a cambios en su configuración, tamaño, etc.
Y comentar para terminar un par de limitaciones de esta visualización: no es posible modificar la transparencia de las burbujas y, tal y como se puede ver en las anteriores imágenes, en ocasiones las burbujas quedan tan cerca del borde que no se muestran completas. Es posible configurar los límites a mostrar en ambos ejes, pero sería preferible que este ajuste fuese automático.
Buena visualización, en general, y muy configurable y versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '25ea049b-c0c3-49b5-a712-a3aadbaa2062') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Scatter Chart</strong> (o <strong>gráfico de dispersión</strong> en español) es una versátil visualización integrada en Power BI que, como indica su nombre, permite crear gráficos de dispersión. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos.
En su versión más sencilla, basta con arrastrar sendos campos a los ejes X e Y (pueden ser tanto campos como medidas, y tanto campos cuantitativos como categóricos) y, si el campo llevado al eje X no es categórico, llevar un campo de nuestro modelo de datos al campo de detalles de la visualización. Por ejemplo, en la siguiente imagen se está mostrando las categorías de productos por ventas totales y margen medio:
Esta es la configuración de la visualización:
Es posible mostrar u ocultar las etiquetas en <em>Formato > Etiquetas de categoría</em>, donde también podremos especificar su color, tamaño, fuente y color de fondo. Podemos aplicar un color discreto a las burbujas en <em>Formato > Colores de datos</em>. Este color puede ser común a todas las burbujas o puede ser especificado para cada una de ellas:
Podemos añadir una dimensión adicional llevando un campo de nuestro modelo de datos al campo <em>Leyenda</em> de la visualización. Si éste campo es el mismo que hemos llevado al campo <em>Detalles</em> de la visualización, simplemente estaremos aplicando un color diferente a cada burbuja (y mostrando la leyenda asociada). Si, por el contrario, se trata de un nuevo campo, cada una de las burbujas originales se desagregará según esta nueva dimensión. Por ejemplo, en la siguiente imagen, tras inhabilitar los colores personalizados que habíamos aplicado (en <em>Formato > Colores de datos</em>) llevamos el campo <em>Gender</em> (con información sobre el sexo de los clientes) al mencionado campo <em>Leyenda</em>:
Podemos configurar las burbujas para que su tamaño sea proporcional al valor de otra métrica. Si, por ejemplo, llevamos la medida <em>Units</em> (que suma el número de unidades vendidas) al campo Tamaño de la visualización, ésta mostraría el siguiente aspecto:
Si, como en este caso, las burbujas son demasiado grandes para poder interactuar con ellas cómodamente, es posible aplicar un factor de aumento/reducción en <em>Formato > Formas > Tamaño</em>. Por defecto este valor es 0, aumentándolo estaremos aumentando también el tamaño de las burbujas. Disminuyéndolo, las haremos menores:
El resultado es el siguiente:
Si movemos el cursor encima de una de las burbujas se muestra una ventana flotante con la información asociada a la burbuja, tal y como cabría esperar:
Y aunque no lo hemos comentado, podemos arrastrar al campo <em>Detalles</em> más de un campo para formar una jerarquía, permitiéndonos la visualización navegar por ella. En la siguiente imagen se han llevado los campos <em>Category</em> y <em>Subcategory</em> (campos de nuestro modelo de datos) al campo <em>Detalles</em> y se ha bajado hasta el nivel de <em>Subcategory</em>. Obsérvense los típicos iconos de Power BI en la parte superior de la visualización permitiéndonos movernos por la jerarquía:
También podemos llevar a la visualización (al campo <em>Eje de reproducción</em>) un campo que sirva para "reproducir" los datos a lo largo de una nueva dimensión (típicamente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>. Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09_0.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca.
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
Es de destacar que cuando se configura la visualización con un eje de reproducción resulta muy lenta respondiendo a cambios en su configuración, tamaño, etc.
Y comentar para terminar un par de limitaciones de esta visualización: no es posible modificar la transparencia de las burbujas y, tal y como se puede ver en las anteriores imágenes, en ocasiones las burbujas quedan tan cerca del borde que no se muestran completas. Es posible configurar los límites a mostrar en ambos ejes, pero sería preferible que este ajuste fuese automático.
Buena visualización, en general, y muy configurable y versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'edd2be1c-813b-461d-853c-6ffc7b4957a8') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Scatter Chart</strong> (o <strong>gráfico de dispersión</strong> en español) es una versátil visualización integrada en Power BI que, como indica su nombre, permite crear gráficos de dispersión. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos.
En su versión más sencilla, basta con arrastrar sendos campos a los ejes X e Y (pueden ser tanto campos como medidas, y tanto campos cuantitativos como categóricos) y, si el campo llevado al eje X no es categórico, llevar un campo de nuestro modelo de datos al campo de detalles de la visualización. Por ejemplo, en la siguiente imagen se está mostrando las categorías de productos por ventas totales y margen medio:
Esta es la configuración de la visualización:
Es posible mostrar u ocultar las etiquetas en <em>Formato > Etiquetas de categoría</em>, donde también podremos especificar su color, tamaño, fuente y color de fondo. Podemos aplicar un color discreto a las burbujas en <em>Formato > Colores de datos</em>. Este color puede ser común a todas las burbujas o puede ser especificado para cada una de ellas:
Podemos añadir una dimensión adicional llevando un campo de nuestro modelo de datos al campo <em>Leyenda</em> de la visualización. Si éste campo es el mismo que hemos llevado al campo <em>Detalles</em> de la visualización, simplemente estaremos aplicando un color diferente a cada burbuja (y mostrando la leyenda asociada). Si, por el contrario, se trata de un nuevo campo, cada una de las burbujas originales se desagregará según esta nueva dimensión. Por ejemplo, en la siguiente imagen, tras inhabilitar los colores personalizados que habíamos aplicado (en <em>Formato > Colores de datos</em>) llevamos el campo <em>Gender</em> (con información sobre el sexo de los clientes) al mencionado campo <em>Leyenda</em>:
Podemos configurar las burbujas para que su tamaño sea proporcional al valor de otra métrica. Si, por ejemplo, llevamos la medida <em>Units</em> (que suma el número de unidades vendidas) al campo Tamaño de la visualización, ésta mostraría el siguiente aspecto:
Si, como en este caso, las burbujas son demasiado grandes para poder interactuar con ellas cómodamente, es posible aplicar un factor de aumento/reducción en <em>Formato > Formas > Tamaño</em>. Por defecto este valor es 0, aumentándolo estaremos aumentando también el tamaño de las burbujas. Disminuyéndolo, las haremos menores:
El resultado es el siguiente:
Si movemos el cursor encima de una de las burbujas se muestra una ventana flotante con la información asociada a la burbuja, tal y como cabría esperar:
Y aunque no lo hemos comentado, podemos arrastrar al campo <em>Detalles</em> más de un campo para formar una jerarquía, permitiéndonos la visualización navegar por ella. En la siguiente imagen se han llevado los campos <em>Category</em> y <em>Subcategory</em> (campos de nuestro modelo de datos) al campo <em>Detalles</em> y se ha bajado hasta el nivel de <em>Subcategory</em>. Obsérvense los típicos iconos de Power BI en la parte superior de la visualización permitiéndonos movernos por la jerarquía:
También podemos llevar a la visualización (al campo <em>Eje de reproducción</em>) un campo que sirva para "reproducir" los datos a lo largo de una nueva dimensión (típicamente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>. Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09_0.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca.
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
Es de destacar que cuando se configura la visualización con un eje de reproducción resulta muy lenta respondiendo a cambios en su configuración, tamaño, etc.
Y comentar para terminar un par de limitaciones de esta visualización: no es posible modificar la transparencia de las burbujas y, tal y como se puede ver en las anteriores imágenes, en ocasiones las burbujas quedan tan cerca del borde que no se muestran completas. Es posible configurar los límites a mostrar en ambos ejes, pero sería preferible que este ajuste fuese automático.
Buena visualización, en general, y muy configurable y versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'edd2be1c-813b-461d-853c-6ffc7b4957a8') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Scatter Chart</strong> (o <strong>gráfico de dispersión</strong> en español) es una versátil visualización integrada en Power BI que, como indica su nombre, permite crear gráficos de dispersión. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos.
En su versión más sencilla, basta con arrastrar sendos campos a los ejes X e Y (pueden ser tanto campos como medidas, y tanto campos cuantitativos como categóricos) y, si el campo llevado al eje X no es categórico, llevar un campo de nuestro modelo de datos al campo de detalles de la visualización. Por ejemplo, en la siguiente imagen se está mostrando las categorías de productos por ventas totales y margen medio:
Esta es la configuración de la visualización:
Es posible mostrar u ocultar las etiquetas en <em>Formato > Etiquetas de categoría</em>, donde también podremos especificar su color, tamaño, fuente y color de fondo. Podemos aplicar un color discreto a las burbujas en <em>Formato > Colores de datos</em>. Este color puede ser común a todas las burbujas o puede ser especificado para cada una de ellas:
Podemos añadir una dimensión adicional llevando un campo de nuestro modelo de datos al campo <em>Leyenda</em> de la visualización. Si éste campo es el mismo que hemos llevado al campo <em>Detalles</em> de la visualización, simplemente estaremos aplicando un color diferente a cada burbuja (y mostrando la leyenda asociada). Si, por el contrario, se trata de un nuevo campo, cada una de las burbujas originales se desagregará según esta nueva dimensión. Por ejemplo, en la siguiente imagen, tras inhabilitar los colores personalizados que habíamos aplicado (en <em>Formato > Colores de datos</em>) llevamos el campo <em>Gender</em> (con información sobre el sexo de los clientes) al mencionado campo <em>Leyenda</em>:
Podemos configurar las burbujas para que su tamaño sea proporcional al valor de otra métrica. Si, por ejemplo, llevamos la medida <em>Units</em> (que suma el número de unidades vendidas) al campo Tamaño de la visualización, ésta mostraría el siguiente aspecto:
Si, como en este caso, las burbujas son demasiado grandes para poder interactuar con ellas cómodamente, es posible aplicar un factor de aumento/reducción en <em>Formato > Formas > Tamaño</em>. Por defecto este valor es 0, aumentándolo estaremos aumentando también el tamaño de las burbujas. Disminuyéndolo, las haremos menores:
El resultado es el siguiente:
Si movemos el cursor encima de una de las burbujas se muestra una ventana flotante con la información asociada a la burbuja, tal y como cabría esperar:
Y aunque no lo hemos comentado, podemos arrastrar al campo <em>Detalles</em> más de un campo para formar una jerarquía, permitiéndonos la visualización navegar por ella. En la siguiente imagen se han llevado los campos <em>Category</em> y <em>Subcategory</em> (campos de nuestro modelo de datos) al campo <em>Detalles</em> y se ha bajado hasta el nivel de <em>Subcategory</em>. Obsérvense los típicos iconos de Power BI en la parte superior de la visualización permitiéndonos movernos por la jerarquía:
También podemos llevar a la visualización (al campo <em>Eje de reproducción</em>) un campo que sirva para "reproducir" los datos a lo largo de una nueva dimensión (típicamente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>. Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09_0.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca.
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
Es de destacar que cuando se configura la visualización con un eje de reproducción resulta muy lenta respondiendo a cambios en su configuración, tamaño, etc.
Y comentar para terminar un par de limitaciones de esta visualización: no es posible modificar la transparencia de las burbujas y, tal y como se puede ver en las anteriores imágenes, en ocasiones las burbujas quedan tan cerca del borde que no se muestran completas. Es posible configurar los límites a mostrar en ambos ejes, pero sería preferible que este ajuste fuese automático.
Buena visualización, en general, y muy configurable y versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'edd2be1c-813b-461d-853c-6ffc7b4957a8') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Scatter Chart</strong> (o <strong>gráfico de dispersión</strong> en español) es una versátil visualización integrada en Power BI que, como indica su nombre, permite crear gráficos de dispersión. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos.
En su versión más sencilla, basta con arrastrar sendos campos a los ejes X e Y (pueden ser tanto campos como medidas, y tanto campos cuantitativos como categóricos) y, si el campo llevado al eje X no es categórico, llevar un campo de nuestro modelo de datos al campo de detalles de la visualización. Por ejemplo, en la siguiente imagen se está mostrando las categorías de productos por ventas totales y margen medio:
Esta es la configuración de la visualización:
Es posible mostrar u ocultar las etiquetas en <em>Formato > Etiquetas de categoría</em>, donde también podremos especificar su color, tamaño, fuente y color de fondo. Podemos aplicar un color discreto a las burbujas en <em>Formato > Colores de datos</em>. Este color puede ser común a todas las burbujas o puede ser especificado para cada una de ellas:
Podemos añadir una dimensión adicional llevando un campo de nuestro modelo de datos al campo <em>Leyenda</em> de la visualización. Si éste campo es el mismo que hemos llevado al campo <em>Detalles</em> de la visualización, simplemente estaremos aplicando un color diferente a cada burbuja (y mostrando la leyenda asociada). Si, por el contrario, se trata de un nuevo campo, cada una de las burbujas originales se desagregará según esta nueva dimensión. Por ejemplo, en la siguiente imagen, tras inhabilitar los colores personalizados que habíamos aplicado (en <em>Formato > Colores de datos</em>) llevamos el campo <em>Gender</em> (con información sobre el sexo de los clientes) al mencionado campo <em>Leyenda</em>:
Podemos configurar las burbujas para que su tamaño sea proporcional al valor de otra métrica. Si, por ejemplo, llevamos la medida <em>Units</em> (que suma el número de unidades vendidas) al campo Tamaño de la visualización, ésta mostraría el siguiente aspecto:
Si, como en este caso, las burbujas son demasiado grandes para poder interactuar con ellas cómodamente, es posible aplicar un factor de aumento/reducción en <em>Formato > Formas > Tamaño</em>. Por defecto este valor es 0, aumentándolo estaremos aumentando también el tamaño de las burbujas. Disminuyéndolo, las haremos menores:
El resultado es el siguiente:
Si movemos el cursor encima de una de las burbujas se muestra una ventana flotante con la información asociada a la burbuja, tal y como cabría esperar:
Y aunque no lo hemos comentado, podemos arrastrar al campo <em>Detalles</em> más de un campo para formar una jerarquía, permitiéndonos la visualización navegar por ella. En la siguiente imagen se han llevado los campos <em>Category</em> y <em>Subcategory</em> (campos de nuestro modelo de datos) al campo <em>Detalles</em> y se ha bajado hasta el nivel de <em>Subcategory</em>. Obsérvense los típicos iconos de Power BI en la parte superior de la visualización permitiéndonos movernos por la jerarquía:
También podemos llevar a la visualización (al campo <em>Eje de reproducción</em>) un campo que sirva para "reproducir" los datos a lo largo de una nueva dimensión (típicamente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>. Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09_0.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca.
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
Es de destacar que cuando se configura la visualización con un eje de reproducción resulta muy lenta respondiendo a cambios en su configuración, tamaño, etc.
Y comentar para terminar un par de limitaciones de esta visualización: no es posible modificar la transparencia de las burbujas y, tal y como se puede ver en las anteriores imágenes, en ocasiones las burbujas quedan tan cerca del borde que no se muestran completas. Es posible configurar los límites a mostrar en ambos ejes, pero sería preferible que este ajuste fuese automático.
Buena visualización, en general, y muy configurable y versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'edd2be1c-813b-461d-853c-6ffc7b4957a8') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Scatter Chart</strong> (o <strong>gráfico de dispersión</strong> en español) es una versátil visualización integrada en Power BI que, como indica su nombre, permite crear gráficos de dispersión. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos.
En su versión más sencilla, basta con arrastrar sendos campos a los ejes X e Y (pueden ser tanto campos como medidas, y tanto campos cuantitativos como categóricos) y, si el campo llevado al eje X no es categórico, llevar un campo de nuestro modelo de datos al campo de detalles de la visualización. Por ejemplo, en la siguiente imagen se está mostrando las categorías de productos por ventas totales y margen medio:
Esta es la configuración de la visualización:
Es posible mostrar u ocultar las etiquetas en <em>Formato > Etiquetas de categoría</em>, donde también podremos especificar su color, tamaño, fuente y color de fondo. Podemos aplicar un color discreto a las burbujas en <em>Formato > Colores de datos</em>. Este color puede ser común a todas las burbujas o puede ser especificado para cada una de ellas:
Podemos añadir una dimensión adicional llevando un campo de nuestro modelo de datos al campo <em>Leyenda</em> de la visualización. Si éste campo es el mismo que hemos llevado al campo <em>Detalles</em> de la visualización, simplemente estaremos aplicando un color diferente a cada burbuja (y mostrando la leyenda asociada). Si, por el contrario, se trata de un nuevo campo, cada una de las burbujas originales se desagregará según esta nueva dimensión. Por ejemplo, en la siguiente imagen, tras inhabilitar los colores personalizados que habíamos aplicado (en <em>Formato > Colores de datos</em>) llevamos el campo <em>Gender</em> (con información sobre el sexo de los clientes) al mencionado campo <em>Leyenda</em>:
Podemos configurar las burbujas para que su tamaño sea proporcional al valor de otra métrica. Si, por ejemplo, llevamos la medida <em>Units</em> (que suma el número de unidades vendidas) al campo Tamaño de la visualización, ésta mostraría el siguiente aspecto:
Si, como en este caso, las burbujas son demasiado grandes para poder interactuar con ellas cómodamente, es posible aplicar un factor de aumento/reducción en <em>Formato > Formas > Tamaño</em>. Por defecto este valor es 0, aumentándolo estaremos aumentando también el tamaño de las burbujas. Disminuyéndolo, las haremos menores:
El resultado es el siguiente:
Si movemos el cursor encima de una de las burbujas se muestra una ventana flotante con la información asociada a la burbuja, tal y como cabría esperar:
Y aunque no lo hemos comentado, podemos arrastrar al campo <em>Detalles</em> más de un campo para formar una jerarquía, permitiéndonos la visualización navegar por ella. En la siguiente imagen se han llevado los campos <em>Category</em> y <em>Subcategory</em> (campos de nuestro modelo de datos) al campo <em>Detalles</em> y se ha bajado hasta el nivel de <em>Subcategory</em>. Obsérvense los típicos iconos de Power BI en la parte superior de la visualización permitiéndonos movernos por la jerarquía:
También podemos llevar a la visualización (al campo <em>Eje de reproducción</em>) un campo que sirva para "reproducir" los datos a lo largo de una nueva dimensión (típicamente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>. Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09_0.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca.
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
Es de destacar que cuando se configura la visualización con un eje de reproducción resulta muy lenta respondiendo a cambios en su configuración, tamaño, etc.
Y comentar para terminar un par de limitaciones de esta visualización: no es posible modificar la transparencia de las burbujas y, tal y como se puede ver en las anteriores imágenes, en ocasiones las burbujas quedan tan cerca del borde que no se muestran completas. Es posible configurar los límites a mostrar en ambos ejes, pero sería preferible que este ajuste fuese automático.
Buena visualización, en general, y muy configurable y versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '097ae575-fc2d-4b9f-8285-2c07f11c7984') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Scatter Chart</strong> (o <strong>gráfico de dispersión</strong> en español) es una versátil visualización integrada en Power BI que, como indica su nombre, permite crear gráficos de dispersión. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos.
En su versión más sencilla, basta con arrastrar sendos campos a los ejes X e Y (pueden ser tanto campos como medidas, y tanto campos cuantitativos como categóricos) y, si el campo llevado al eje X no es categórico, llevar un campo de nuestro modelo de datos al campo de detalles de la visualización. Por ejemplo, en la siguiente imagen se está mostrando las categorías de productos por ventas totales y margen medio:
Esta es la configuración de la visualización:
Es posible mostrar u ocultar las etiquetas en <em>Formato > Etiquetas de categoría</em>, donde también podremos especificar su color, tamaño, fuente y color de fondo. Podemos aplicar un color discreto a las burbujas en <em>Formato > Colores de datos</em>. Este color puede ser común a todas las burbujas o puede ser especificado para cada una de ellas:
Podemos añadir una dimensión adicional llevando un campo de nuestro modelo de datos al campo <em>Leyenda</em> de la visualización. Si éste campo es el mismo que hemos llevado al campo <em>Detalles</em> de la visualización, simplemente estaremos aplicando un color diferente a cada burbuja (y mostrando la leyenda asociada). Si, por el contrario, se trata de un nuevo campo, cada una de las burbujas originales se desagregará según esta nueva dimensión. Por ejemplo, en la siguiente imagen, tras inhabilitar los colores personalizados que habíamos aplicado (en <em>Formato > Colores de datos</em>) llevamos el campo <em>Gender</em> (con información sobre el sexo de los clientes) al mencionado campo <em>Leyenda</em>:
Podemos configurar las burbujas para que su tamaño sea proporcional al valor de otra métrica. Si, por ejemplo, llevamos la medida <em>Units</em> (que suma el número de unidades vendidas) al campo Tamaño de la visualización, ésta mostraría el siguiente aspecto:
Si, como en este caso, las burbujas son demasiado grandes para poder interactuar con ellas cómodamente, es posible aplicar un factor de aumento/reducción en <em>Formato > Formas > Tamaño</em>. Por defecto este valor es 0, aumentándolo estaremos aumentando también el tamaño de las burbujas. Disminuyéndolo, las haremos menores:
El resultado es el siguiente:
Si movemos el cursor encima de una de las burbujas se muestra una ventana flotante con la información asociada a la burbuja, tal y como cabría esperar:
Y aunque no lo hemos comentado, podemos arrastrar al campo <em>Detalles</em> más de un campo para formar una jerarquía, permitiéndonos la visualización navegar por ella. En la siguiente imagen se han llevado los campos <em>Category</em> y <em>Subcategory</em> (campos de nuestro modelo de datos) al campo <em>Detalles</em> y se ha bajado hasta el nivel de <em>Subcategory</em>. Obsérvense los típicos iconos de Power BI en la parte superior de la visualización permitiéndonos movernos por la jerarquía:
También podemos llevar a la visualización (al campo <em>Eje de reproducción</em>) un campo que sirva para "reproducir" los datos a lo largo de una nueva dimensión (típicamente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>. Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09_0.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca.
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
Es de destacar que cuando se configura la visualización con un eje de reproducción resulta muy lenta respondiendo a cambios en su configuración, tamaño, etc.
Y comentar para terminar un par de limitaciones de esta visualización: no es posible modificar la transparencia de las burbujas y, tal y como se puede ver en las anteriores imágenes, en ocasiones las burbujas quedan tan cerca del borde que no se muestran completas. Es posible configurar los límites a mostrar en ambos ejes, pero sería preferible que este ajuste fuese automático.
Buena visualización, en general, y muy configurable y versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '097ae575-fc2d-4b9f-8285-2c07f11c7984') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Scatter Chart</strong> (o <strong>gráfico de dispersión</strong> en español) es una versátil visualización integrada en Power BI que, como indica su nombre, permite crear gráficos de dispersión. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos.
En su versión más sencilla, basta con arrastrar sendos campos a los ejes X e Y (pueden ser tanto campos como medidas, y tanto campos cuantitativos como categóricos) y, si el campo llevado al eje X no es categórico, llevar un campo de nuestro modelo de datos al campo de detalles de la visualización. Por ejemplo, en la siguiente imagen se está mostrando las categorías de productos por ventas totales y margen medio:
Esta es la configuración de la visualización:
Es posible mostrar u ocultar las etiquetas en <em>Formato > Etiquetas de categoría</em>, donde también podremos especificar su color, tamaño, fuente y color de fondo. Podemos aplicar un color discreto a las burbujas en <em>Formato > Colores de datos</em>. Este color puede ser común a todas las burbujas o puede ser especificado para cada una de ellas:
Podemos añadir una dimensión adicional llevando un campo de nuestro modelo de datos al campo <em>Leyenda</em> de la visualización. Si éste campo es el mismo que hemos llevado al campo <em>Detalles</em> de la visualización, simplemente estaremos aplicando un color diferente a cada burbuja (y mostrando la leyenda asociada). Si, por el contrario, se trata de un nuevo campo, cada una de las burbujas originales se desagregará según esta nueva dimensión. Por ejemplo, en la siguiente imagen, tras inhabilitar los colores personalizados que habíamos aplicado (en <em>Formato > Colores de datos</em>) llevamos el campo <em>Gender</em> (con información sobre el sexo de los clientes) al mencionado campo <em>Leyenda</em>:
Podemos configurar las burbujas para que su tamaño sea proporcional al valor de otra métrica. Si, por ejemplo, llevamos la medida <em>Units</em> (que suma el número de unidades vendidas) al campo Tamaño de la visualización, ésta mostraría el siguiente aspecto:
Si, como en este caso, las burbujas son demasiado grandes para poder interactuar con ellas cómodamente, es posible aplicar un factor de aumento/reducción en <em>Formato > Formas > Tamaño</em>. Por defecto este valor es 0, aumentándolo estaremos aumentando también el tamaño de las burbujas. Disminuyéndolo, las haremos menores:
El resultado es el siguiente:
Si movemos el cursor encima de una de las burbujas se muestra una ventana flotante con la información asociada a la burbuja, tal y como cabría esperar:
Y aunque no lo hemos comentado, podemos arrastrar al campo <em>Detalles</em> más de un campo para formar una jerarquía, permitiéndonos la visualización navegar por ella. En la siguiente imagen se han llevado los campos <em>Category</em> y <em>Subcategory</em> (campos de nuestro modelo de datos) al campo <em>Detalles</em> y se ha bajado hasta el nivel de <em>Subcategory</em>. Obsérvense los típicos iconos de Power BI en la parte superior de la visualización permitiéndonos movernos por la jerarquía:
También podemos llevar a la visualización (al campo <em>Eje de reproducción</em>) un campo que sirva para "reproducir" los datos a lo largo de una nueva dimensión (típicamente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>. Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09_0.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca.
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
Es de destacar que cuando se configura la visualización con un eje de reproducción resulta muy lenta respondiendo a cambios en su configuración, tamaño, etc.
Y comentar para terminar un par de limitaciones de esta visualización: no es posible modificar la transparencia de las burbujas y, tal y como se puede ver en las anteriores imágenes, en ocasiones las burbujas quedan tan cerca del borde que no se muestran completas. Es posible configurar los límites a mostrar en ambos ejes, pero sería preferible que este ajuste fuese automático.
Buena visualización, en general, y muy configurable y versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '097ae575-fc2d-4b9f-8285-2c07f11c7984') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Scatter Chart</strong> (o <strong>gráfico de dispersión</strong> en español) es una versátil visualización integrada en Power BI que, como indica su nombre, permite crear gráficos de dispersión. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos.
En su versión más sencilla, basta con arrastrar sendos campos a los ejes X e Y (pueden ser tanto campos como medidas, y tanto campos cuantitativos como categóricos) y, si el campo llevado al eje X no es categórico, llevar un campo de nuestro modelo de datos al campo de detalles de la visualización. Por ejemplo, en la siguiente imagen se está mostrando las categorías de productos por ventas totales y margen medio:
Esta es la configuración de la visualización:
Es posible mostrar u ocultar las etiquetas en <em>Formato > Etiquetas de categoría</em>, donde también podremos especificar su color, tamaño, fuente y color de fondo. Podemos aplicar un color discreto a las burbujas en <em>Formato > Colores de datos</em>. Este color puede ser común a todas las burbujas o puede ser especificado para cada una de ellas:
Podemos añadir una dimensión adicional llevando un campo de nuestro modelo de datos al campo <em>Leyenda</em> de la visualización. Si éste campo es el mismo que hemos llevado al campo <em>Detalles</em> de la visualización, simplemente estaremos aplicando un color diferente a cada burbuja (y mostrando la leyenda asociada). Si, por el contrario, se trata de un nuevo campo, cada una de las burbujas originales se desagregará según esta nueva dimensión. Por ejemplo, en la siguiente imagen, tras inhabilitar los colores personalizados que habíamos aplicado (en <em>Formato > Colores de datos</em>) llevamos el campo <em>Gender</em> (con información sobre el sexo de los clientes) al mencionado campo <em>Leyenda</em>:
Podemos configurar las burbujas para que su tamaño sea proporcional al valor de otra métrica. Si, por ejemplo, llevamos la medida <em>Units</em> (que suma el número de unidades vendidas) al campo Tamaño de la visualización, ésta mostraría el siguiente aspecto:
Si, como en este caso, las burbujas son demasiado grandes para poder interactuar con ellas cómodamente, es posible aplicar un factor de aumento/reducción en <em>Formato > Formas > Tamaño</em>. Por defecto este valor es 0, aumentándolo estaremos aumentando también el tamaño de las burbujas. Disminuyéndolo, las haremos menores:
El resultado es el siguiente:
Si movemos el cursor encima de una de las burbujas se muestra una ventana flotante con la información asociada a la burbuja, tal y como cabría esperar:
Y aunque no lo hemos comentado, podemos arrastrar al campo <em>Detalles</em> más de un campo para formar una jerarquía, permitiéndonos la visualización navegar por ella. En la siguiente imagen se han llevado los campos <em>Category</em> y <em>Subcategory</em> (campos de nuestro modelo de datos) al campo <em>Detalles</em> y se ha bajado hasta el nivel de <em>Subcategory</em>. Obsérvense los típicos iconos de Power BI en la parte superior de la visualización permitiéndonos movernos por la jerarquía:
También podemos llevar a la visualización (al campo <em>Eje de reproducción</em>) un campo que sirva para "reproducir" los datos a lo largo de una nueva dimensión (típicamente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>. Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09_0.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca.
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
Es de destacar que cuando se configura la visualización con un eje de reproducción resulta muy lenta respondiendo a cambios en su configuración, tamaño, etc.
Y comentar para terminar un par de limitaciones de esta visualización: no es posible modificar la transparencia de las burbujas y, tal y como se puede ver en las anteriores imágenes, en ocasiones las burbujas quedan tan cerca del borde que no se muestran completas. Es posible configurar los límites a mostrar en ambos ejes, pero sería preferible que este ajuste fuese automático.
Buena visualización, en general, y muy configurable y versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '097ae575-fc2d-4b9f-8285-2c07f11c7984') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Scatter Chart</strong> (o <strong>gráfico de dispersión</strong> en español) es una versátil visualización integrada en Power BI que, como indica su nombre, permite crear gráficos de dispersión. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos.
En su versión más sencilla, basta con arrastrar sendos campos a los ejes X e Y (pueden ser tanto campos como medidas, y tanto campos cuantitativos como categóricos) y, si el campo llevado al eje X no es categórico, llevar un campo de nuestro modelo de datos al campo de detalles de la visualización. Por ejemplo, en la siguiente imagen se está mostrando las categorías de productos por ventas totales y margen medio:
Esta es la configuración de la visualización:
Es posible mostrar u ocultar las etiquetas en <em>Formato > Etiquetas de categoría</em>, donde también podremos especificar su color, tamaño, fuente y color de fondo. Podemos aplicar un color discreto a las burbujas en <em>Formato > Colores de datos</em>. Este color puede ser común a todas las burbujas o puede ser especificado para cada una de ellas:
Podemos añadir una dimensión adicional llevando un campo de nuestro modelo de datos al campo <em>Leyenda</em> de la visualización. Si éste campo es el mismo que hemos llevado al campo <em>Detalles</em> de la visualización, simplemente estaremos aplicando un color diferente a cada burbuja (y mostrando la leyenda asociada). Si, por el contrario, se trata de un nuevo campo, cada una de las burbujas originales se desagregará según esta nueva dimensión. Por ejemplo, en la siguiente imagen, tras inhabilitar los colores personalizados que habíamos aplicado (en <em>Formato > Colores de datos</em>) llevamos el campo <em>Gender</em> (con información sobre el sexo de los clientes) al mencionado campo <em>Leyenda</em>:
Podemos configurar las burbujas para que su tamaño sea proporcional al valor de otra métrica. Si, por ejemplo, llevamos la medida <em>Units</em> (que suma el número de unidades vendidas) al campo Tamaño de la visualización, ésta mostraría el siguiente aspecto:
Si, como en este caso, las burbujas son demasiado grandes para poder interactuar con ellas cómodamente, es posible aplicar un factor de aumento/reducción en <em>Formato > Formas > Tamaño</em>. Por defecto este valor es 0, aumentándolo estaremos aumentando también el tamaño de las burbujas. Disminuyéndolo, las haremos menores:
El resultado es el siguiente:
Si movemos el cursor encima de una de las burbujas se muestra una ventana flotante con la información asociada a la burbuja, tal y como cabría esperar:
Y aunque no lo hemos comentado, podemos arrastrar al campo <em>Detalles</em> más de un campo para formar una jerarquía, permitiéndonos la visualización navegar por ella. En la siguiente imagen se han llevado los campos <em>Category</em> y <em>Subcategory</em> (campos de nuestro modelo de datos) al campo <em>Detalles</em> y se ha bajado hasta el nivel de <em>Subcategory</em>. Obsérvense los típicos iconos de Power BI en la parte superior de la visualización permitiéndonos movernos por la jerarquía:
También podemos llevar a la visualización (al campo <em>Eje de reproducción</em>) un campo que sirva para "reproducir" los datos a lo largo de una nueva dimensión (típicamente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>. Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09_0.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca.
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
Es de destacar que cuando se configura la visualización con un eje de reproducción resulta muy lenta respondiendo a cambios en su configuración, tamaño, etc.
Y comentar para terminar un par de limitaciones de esta visualización: no es posible modificar la transparencia de las burbujas y, tal y como se puede ver en las anteriores imágenes, en ocasiones las burbujas quedan tan cerca del borde que no se muestran completas. Es posible configurar los límites a mostrar en ambos ejes, pero sería preferible que este ajuste fuese automático.
Buena visualización, en general, y muy configurable y versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '0c9e447b-f659-4f9b-b5bd-e7d878447b72') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Scatter Chart</strong> (o <strong>gráfico de dispersión</strong> en español) es una versátil visualización integrada en Power BI que, como indica su nombre, permite crear gráficos de dispersión. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos.
En su versión más sencilla, basta con arrastrar sendos campos a los ejes X e Y (pueden ser tanto campos como medidas, y tanto campos cuantitativos como categóricos) y, si el campo llevado al eje X no es categórico, llevar un campo de nuestro modelo de datos al campo de detalles de la visualización. Por ejemplo, en la siguiente imagen se está mostrando las categorías de productos por ventas totales y margen medio:
Esta es la configuración de la visualización:
Es posible mostrar u ocultar las etiquetas en <em>Formato > Etiquetas de categoría</em>, donde también podremos especificar su color, tamaño, fuente y color de fondo. Podemos aplicar un color discreto a las burbujas en <em>Formato > Colores de datos</em>. Este color puede ser común a todas las burbujas o puede ser especificado para cada una de ellas:
Podemos añadir una dimensión adicional llevando un campo de nuestro modelo de datos al campo <em>Leyenda</em> de la visualización. Si éste campo es el mismo que hemos llevado al campo <em>Detalles</em> de la visualización, simplemente estaremos aplicando un color diferente a cada burbuja (y mostrando la leyenda asociada). Si, por el contrario, se trata de un nuevo campo, cada una de las burbujas originales se desagregará según esta nueva dimensión. Por ejemplo, en la siguiente imagen, tras inhabilitar los colores personalizados que habíamos aplicado (en <em>Formato > Colores de datos</em>) llevamos el campo <em>Gender</em> (con información sobre el sexo de los clientes) al mencionado campo <em>Leyenda</em>:
Podemos configurar las burbujas para que su tamaño sea proporcional al valor de otra métrica. Si, por ejemplo, llevamos la medida <em>Units</em> (que suma el número de unidades vendidas) al campo Tamaño de la visualización, ésta mostraría el siguiente aspecto:
Si, como en este caso, las burbujas son demasiado grandes para poder interactuar con ellas cómodamente, es posible aplicar un factor de aumento/reducción en <em>Formato > Formas > Tamaño</em>. Por defecto este valor es 0, aumentándolo estaremos aumentando también el tamaño de las burbujas. Disminuyéndolo, las haremos menores:
El resultado es el siguiente:
Si movemos el cursor encima de una de las burbujas se muestra una ventana flotante con la información asociada a la burbuja, tal y como cabría esperar:
Y aunque no lo hemos comentado, podemos arrastrar al campo <em>Detalles</em> más de un campo para formar una jerarquía, permitiéndonos la visualización navegar por ella. En la siguiente imagen se han llevado los campos <em>Category</em> y <em>Subcategory</em> (campos de nuestro modelo de datos) al campo <em>Detalles</em> y se ha bajado hasta el nivel de <em>Subcategory</em>. Obsérvense los típicos iconos de Power BI en la parte superior de la visualización permitiéndonos movernos por la jerarquía:
También podemos llevar a la visualización (al campo <em>Eje de reproducción</em>) un campo que sirva para "reproducir" los datos a lo largo de una nueva dimensión (típicamente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>. Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09_0.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca.
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
Es de destacar que cuando se configura la visualización con un eje de reproducción resulta muy lenta respondiendo a cambios en su configuración, tamaño, etc.
Y comentar para terminar un par de limitaciones de esta visualización: no es posible modificar la transparencia de las burbujas y, tal y como se puede ver en las anteriores imágenes, en ocasiones las burbujas quedan tan cerca del borde que no se muestran completas. Es posible configurar los límites a mostrar en ambos ejes, pero sería preferible que este ajuste fuese automático.
Buena visualización, en general, y muy configurable y versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '0c9e447b-f659-4f9b-b5bd-e7d878447b72') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Scatter Chart</strong> (o <strong>gráfico de dispersión</strong> en español) es una versátil visualización integrada en Power BI que, como indica su nombre, permite crear gráficos de dispersión. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos.
En su versión más sencilla, basta con arrastrar sendos campos a los ejes X e Y (pueden ser tanto campos como medidas, y tanto campos cuantitativos como categóricos) y, si el campo llevado al eje X no es categórico, llevar un campo de nuestro modelo de datos al campo de detalles de la visualización. Por ejemplo, en la siguiente imagen se está mostrando las categorías de productos por ventas totales y margen medio:
Esta es la configuración de la visualización:
Es posible mostrar u ocultar las etiquetas en <em>Formato > Etiquetas de categoría</em>, donde también podremos especificar su color, tamaño, fuente y color de fondo. Podemos aplicar un color discreto a las burbujas en <em>Formato > Colores de datos</em>. Este color puede ser común a todas las burbujas o puede ser especificado para cada una de ellas:
Podemos añadir una dimensión adicional llevando un campo de nuestro modelo de datos al campo <em>Leyenda</em> de la visualización. Si éste campo es el mismo que hemos llevado al campo <em>Detalles</em> de la visualización, simplemente estaremos aplicando un color diferente a cada burbuja (y mostrando la leyenda asociada). Si, por el contrario, se trata de un nuevo campo, cada una de las burbujas originales se desagregará según esta nueva dimensión. Por ejemplo, en la siguiente imagen, tras inhabilitar los colores personalizados que habíamos aplicado (en <em>Formato > Colores de datos</em>) llevamos el campo <em>Gender</em> (con información sobre el sexo de los clientes) al mencionado campo <em>Leyenda</em>:
Podemos configurar las burbujas para que su tamaño sea proporcional al valor de otra métrica. Si, por ejemplo, llevamos la medida <em>Units</em> (que suma el número de unidades vendidas) al campo Tamaño de la visualización, ésta mostraría el siguiente aspecto:
Si, como en este caso, las burbujas son demasiado grandes para poder interactuar con ellas cómodamente, es posible aplicar un factor de aumento/reducción en <em>Formato > Formas > Tamaño</em>. Por defecto este valor es 0, aumentándolo estaremos aumentando también el tamaño de las burbujas. Disminuyéndolo, las haremos menores:
El resultado es el siguiente:
Si movemos el cursor encima de una de las burbujas se muestra una ventana flotante con la información asociada a la burbuja, tal y como cabría esperar:
Y aunque no lo hemos comentado, podemos arrastrar al campo <em>Detalles</em> más de un campo para formar una jerarquía, permitiéndonos la visualización navegar por ella. En la siguiente imagen se han llevado los campos <em>Category</em> y <em>Subcategory</em> (campos de nuestro modelo de datos) al campo <em>Detalles</em> y se ha bajado hasta el nivel de <em>Subcategory</em>. Obsérvense los típicos iconos de Power BI en la parte superior de la visualización permitiéndonos movernos por la jerarquía:
También podemos llevar a la visualización (al campo <em>Eje de reproducción</em>) un campo que sirva para "reproducir" los datos a lo largo de una nueva dimensión (típicamente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>. Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09_0.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca.
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
Es de destacar que cuando se configura la visualización con un eje de reproducción resulta muy lenta respondiendo a cambios en su configuración, tamaño, etc.
Y comentar para terminar un par de limitaciones de esta visualización: no es posible modificar la transparencia de las burbujas y, tal y como se puede ver en las anteriores imágenes, en ocasiones las burbujas quedan tan cerca del borde que no se muestran completas. Es posible configurar los límites a mostrar en ambos ejes, pero sería preferible que este ajuste fuese automático.
Buena visualización, en general, y muy configurable y versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '0c9e447b-f659-4f9b-b5bd-e7d878447b72') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Scatter Chart</strong> (o <strong>gráfico de dispersión</strong> en español) es una versátil visualización integrada en Power BI que, como indica su nombre, permite crear gráficos de dispersión. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos.
En su versión más sencilla, basta con arrastrar sendos campos a los ejes X e Y (pueden ser tanto campos como medidas, y tanto campos cuantitativos como categóricos) y, si el campo llevado al eje X no es categórico, llevar un campo de nuestro modelo de datos al campo de detalles de la visualización. Por ejemplo, en la siguiente imagen se está mostrando las categorías de productos por ventas totales y margen medio:
Esta es la configuración de la visualización:
Es posible mostrar u ocultar las etiquetas en <em>Formato > Etiquetas de categoría</em>, donde también podremos especificar su color, tamaño, fuente y color de fondo. Podemos aplicar un color discreto a las burbujas en <em>Formato > Colores de datos</em>. Este color puede ser común a todas las burbujas o puede ser especificado para cada una de ellas:
Podemos añadir una dimensión adicional llevando un campo de nuestro modelo de datos al campo <em>Leyenda</em> de la visualización. Si éste campo es el mismo que hemos llevado al campo <em>Detalles</em> de la visualización, simplemente estaremos aplicando un color diferente a cada burbuja (y mostrando la leyenda asociada). Si, por el contrario, se trata de un nuevo campo, cada una de las burbujas originales se desagregará según esta nueva dimensión. Por ejemplo, en la siguiente imagen, tras inhabilitar los colores personalizados que habíamos aplicado (en <em>Formato > Colores de datos</em>) llevamos el campo <em>Gender</em> (con información sobre el sexo de los clientes) al mencionado campo <em>Leyenda</em>:
Podemos configurar las burbujas para que su tamaño sea proporcional al valor de otra métrica. Si, por ejemplo, llevamos la medida <em>Units</em> (que suma el número de unidades vendidas) al campo Tamaño de la visualización, ésta mostraría el siguiente aspecto:
Si, como en este caso, las burbujas son demasiado grandes para poder interactuar con ellas cómodamente, es posible aplicar un factor de aumento/reducción en <em>Formato > Formas > Tamaño</em>. Por defecto este valor es 0, aumentándolo estaremos aumentando también el tamaño de las burbujas. Disminuyéndolo, las haremos menores:
El resultado es el siguiente:
Si movemos el cursor encima de una de las burbujas se muestra una ventana flotante con la información asociada a la burbuja, tal y como cabría esperar:
Y aunque no lo hemos comentado, podemos arrastrar al campo <em>Detalles</em> más de un campo para formar una jerarquía, permitiéndonos la visualización navegar por ella. En la siguiente imagen se han llevado los campos <em>Category</em> y <em>Subcategory</em> (campos de nuestro modelo de datos) al campo <em>Detalles</em> y se ha bajado hasta el nivel de <em>Subcategory</em>. Obsérvense los típicos iconos de Power BI en la parte superior de la visualización permitiéndonos movernos por la jerarquía:
También podemos llevar a la visualización (al campo <em>Eje de reproducción</em>) un campo que sirva para "reproducir" los datos a lo largo de una nueva dimensión (típicamente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>. Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09_0.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca.
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
Es de destacar que cuando se configura la visualización con un eje de reproducción resulta muy lenta respondiendo a cambios en su configuración, tamaño, etc.
Y comentar para terminar un par de limitaciones de esta visualización: no es posible modificar la transparencia de las burbujas y, tal y como se puede ver en las anteriores imágenes, en ocasiones las burbujas quedan tan cerca del borde que no se muestran completas. Es posible configurar los límites a mostrar en ambos ejes, pero sería preferible que este ajuste fuese automático.
Buena visualización, en general, y muy configurable y versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '0c9e447b-f659-4f9b-b5bd-e7d878447b72') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Scatter Chart</strong> (o <strong>gráfico de dispersión</strong> en español) es una versátil visualización integrada en Power BI que, como indica su nombre, permite crear gráficos de dispersión. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos.
En su versión más sencilla, basta con arrastrar sendos campos a los ejes X e Y (pueden ser tanto campos como medidas, y tanto campos cuantitativos como categóricos) y, si el campo llevado al eje X no es categórico, llevar un campo de nuestro modelo de datos al campo de detalles de la visualización. Por ejemplo, en la siguiente imagen se está mostrando las categorías de productos por ventas totales y margen medio:
Esta es la configuración de la visualización:
Es posible mostrar u ocultar las etiquetas en <em>Formato > Etiquetas de categoría</em>, donde también podremos especificar su color, tamaño, fuente y color de fondo. Podemos aplicar un color discreto a las burbujas en <em>Formato > Colores de datos</em>. Este color puede ser común a todas las burbujas o puede ser especificado para cada una de ellas:
Podemos añadir una dimensión adicional llevando un campo de nuestro modelo de datos al campo <em>Leyenda</em> de la visualización. Si éste campo es el mismo que hemos llevado al campo <em>Detalles</em> de la visualización, simplemente estaremos aplicando un color diferente a cada burbuja (y mostrando la leyenda asociada). Si, por el contrario, se trata de un nuevo campo, cada una de las burbujas originales se desagregará según esta nueva dimensión. Por ejemplo, en la siguiente imagen, tras inhabilitar los colores personalizados que habíamos aplicado (en <em>Formato > Colores de datos</em>) llevamos el campo <em>Gender</em> (con información sobre el sexo de los clientes) al mencionado campo <em>Leyenda</em>:
Podemos configurar las burbujas para que su tamaño sea proporcional al valor de otra métrica. Si, por ejemplo, llevamos la medida <em>Units</em> (que suma el número de unidades vendidas) al campo Tamaño de la visualización, ésta mostraría el siguiente aspecto:
Si, como en este caso, las burbujas son demasiado grandes para poder interactuar con ellas cómodamente, es posible aplicar un factor de aumento/reducción en <em>Formato > Formas > Tamaño</em>. Por defecto este valor es 0, aumentándolo estaremos aumentando también el tamaño de las burbujas. Disminuyéndolo, las haremos menores:
El resultado es el siguiente:
Si movemos el cursor encima de una de las burbujas se muestra una ventana flotante con la información asociada a la burbuja, tal y como cabría esperar:
Y aunque no lo hemos comentado, podemos arrastrar al campo <em>Detalles</em> más de un campo para formar una jerarquía, permitiéndonos la visualización navegar por ella. En la siguiente imagen se han llevado los campos <em>Category</em> y <em>Subcategory</em> (campos de nuestro modelo de datos) al campo <em>Detalles</em> y se ha bajado hasta el nivel de <em>Subcategory</em>. Obsérvense los típicos iconos de Power BI en la parte superior de la visualización permitiéndonos movernos por la jerarquía:
También podemos llevar a la visualización (al campo <em>Eje de reproducción</em>) un campo que sirva para "reproducir" los datos a lo largo de una nueva dimensión (típicamente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>. Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09_0.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca.
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
Es de destacar que cuando se configura la visualización con un eje de reproducción resulta muy lenta respondiendo a cambios en su configuración, tamaño, etc.
Y comentar para terminar un par de limitaciones de esta visualización: no es posible modificar la transparencia de las burbujas y, tal y como se puede ver en las anteriores imágenes, en ocasiones las burbujas quedan tan cerca del borde que no se muestran completas. Es posible configurar los límites a mostrar en ambos ejes, pero sería preferible que este ajuste fuese automático.
Buena visualización, en general, y muy configurable y versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-91beedb0-f9e7-4dfd-8ee2-f58d976b3b2a') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Scatter Chart</strong> (o <strong>gráfico de dispersión</strong> en español) es una versátil visualización integrada en Power BI que, como indica su nombre, permite crear gráficos de dispersión. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos.
En su versión más sencilla, basta con arrastrar sendos campos a los ejes X e Y (pueden ser tanto campos como medidas, y tanto campos cuantitativos como categóricos) y, si el campo llevado al eje X no es categórico, llevar un campo de nuestro modelo de datos al campo de detalles de la visualización. Por ejemplo, en la siguiente imagen se está mostrando las categorías de productos por ventas totales y margen medio:
Esta es la configuración de la visualización:
Es posible mostrar u ocultar las etiquetas en <em>Formato > Etiquetas de categoría</em>, donde también podremos especificar su color, tamaño, fuente y color de fondo. Podemos aplicar un color discreto a las burbujas en <em>Formato > Colores de datos</em>. Este color puede ser común a todas las burbujas o puede ser especificado para cada una de ellas:
Podemos añadir una dimensión adicional llevando un campo de nuestro modelo de datos al campo <em>Leyenda</em> de la visualización. Si éste campo es el mismo que hemos llevado al campo <em>Detalles</em> de la visualización, simplemente estaremos aplicando un color diferente a cada burbuja (y mostrando la leyenda asociada). Si, por el contrario, se trata de un nuevo campo, cada una de las burbujas originales se desagregará según esta nueva dimensión. Por ejemplo, en la siguiente imagen, tras inhabilitar los colores personalizados que habíamos aplicado (en <em>Formato > Colores de datos</em>) llevamos el campo <em>Gender</em> (con información sobre el sexo de los clientes) al mencionado campo <em>Leyenda</em>:
Podemos configurar las burbujas para que su tamaño sea proporcional al valor de otra métrica. Si, por ejemplo, llevamos la medida <em>Units</em> (que suma el número de unidades vendidas) al campo Tamaño de la visualización, ésta mostraría el siguiente aspecto:
Si, como en este caso, las burbujas son demasiado grandes para poder interactuar con ellas cómodamente, es posible aplicar un factor de aumento/reducción en <em>Formato > Formas > Tamaño</em>. Por defecto este valor es 0, aumentándolo estaremos aumentando también el tamaño de las burbujas. Disminuyéndolo, las haremos menores:
El resultado es el siguiente:
Si movemos el cursor encima de una de las burbujas se muestra una ventana flotante con la información asociada a la burbuja, tal y como cabría esperar:
Y aunque no lo hemos comentado, podemos arrastrar al campo <em>Detalles</em> más de un campo para formar una jerarquía, permitiéndonos la visualización navegar por ella. En la siguiente imagen se han llevado los campos <em>Category</em> y <em>Subcategory</em> (campos de nuestro modelo de datos) al campo <em>Detalles</em> y se ha bajado hasta el nivel de <em>Subcategory</em>. Obsérvense los típicos iconos de Power BI en la parte superior de la visualización permitiéndonos movernos por la jerarquía:
También podemos llevar a la visualización (al campo <em>Eje de reproducción</em>) un campo que sirva para "reproducir" los datos a lo largo de una nueva dimensión (típicamente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>. Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09_0.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca.
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
Es de destacar que cuando se configura la visualización con un eje de reproducción resulta muy lenta respondiendo a cambios en su configuración, tamaño, etc.
Y comentar para terminar un par de limitaciones de esta visualización: no es posible modificar la transparencia de las burbujas y, tal y como se puede ver en las anteriores imágenes, en ocasiones las burbujas quedan tan cerca del borde que no se muestran completas. Es posible configurar los límites a mostrar en ambos ejes, pero sería preferible que este ajuste fuese automático.
Buena visualización, en general, y muy configurable y versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-91beedb0-f9e7-4dfd-8ee2-f58d976b3b2a') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Scatter Chart</strong> (o <strong>gráfico de dispersión</strong> en español) es una versátil visualización integrada en Power BI que, como indica su nombre, permite crear gráficos de dispersión. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos.
En su versión más sencilla, basta con arrastrar sendos campos a los ejes X e Y (pueden ser tanto campos como medidas, y tanto campos cuantitativos como categóricos) y, si el campo llevado al eje X no es categórico, llevar un campo de nuestro modelo de datos al campo de detalles de la visualización. Por ejemplo, en la siguiente imagen se está mostrando las categorías de productos por ventas totales y margen medio:
Esta es la configuración de la visualización:
Es posible mostrar u ocultar las etiquetas en <em>Formato > Etiquetas de categoría</em>, donde también podremos especificar su color, tamaño, fuente y color de fondo. Podemos aplicar un color discreto a las burbujas en <em>Formato > Colores de datos</em>. Este color puede ser común a todas las burbujas o puede ser especificado para cada una de ellas:
Podemos añadir una dimensión adicional llevando un campo de nuestro modelo de datos al campo <em>Leyenda</em> de la visualización. Si éste campo es el mismo que hemos llevado al campo <em>Detalles</em> de la visualización, simplemente estaremos aplicando un color diferente a cada burbuja (y mostrando la leyenda asociada). Si, por el contrario, se trata de un nuevo campo, cada una de las burbujas originales se desagregará según esta nueva dimensión. Por ejemplo, en la siguiente imagen, tras inhabilitar los colores personalizados que habíamos aplicado (en <em>Formato > Colores de datos</em>) llevamos el campo <em>Gender</em> (con información sobre el sexo de los clientes) al mencionado campo <em>Leyenda</em>:
Podemos configurar las burbujas para que su tamaño sea proporcional al valor de otra métrica. Si, por ejemplo, llevamos la medida <em>Units</em> (que suma el número de unidades vendidas) al campo Tamaño de la visualización, ésta mostraría el siguiente aspecto:
Si, como en este caso, las burbujas son demasiado grandes para poder interactuar con ellas cómodamente, es posible aplicar un factor de aumento/reducción en <em>Formato > Formas > Tamaño</em>. Por defecto este valor es 0, aumentándolo estaremos aumentando también el tamaño de las burbujas. Disminuyéndolo, las haremos menores:
El resultado es el siguiente:
Si movemos el cursor encima de una de las burbujas se muestra una ventana flotante con la información asociada a la burbuja, tal y como cabría esperar:
Y aunque no lo hemos comentado, podemos arrastrar al campo <em>Detalles</em> más de un campo para formar una jerarquía, permitiéndonos la visualización navegar por ella. En la siguiente imagen se han llevado los campos <em>Category</em> y <em>Subcategory</em> (campos de nuestro modelo de datos) al campo <em>Detalles</em> y se ha bajado hasta el nivel de <em>Subcategory</em>. Obsérvense los típicos iconos de Power BI en la parte superior de la visualización permitiéndonos movernos por la jerarquía:
También podemos llevar a la visualización (al campo <em>Eje de reproducción</em>) un campo que sirva para "reproducir" los datos a lo largo de una nueva dimensión (típicamente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>. Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09_0.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca.
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
Es de destacar que cuando se configura la visualización con un eje de reproducción resulta muy lenta respondiendo a cambios en su configuración, tamaño, etc.
Y comentar para terminar un par de limitaciones de esta visualización: no es posible modificar la transparencia de las burbujas y, tal y como se puede ver en las anteriores imágenes, en ocasiones las burbujas quedan tan cerca del borde que no se muestran completas. Es posible configurar los límites a mostrar en ambos ejes, pero sería preferible que este ajuste fuese automático.
Buena visualización, en general, y muy configurable y versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-91beedb0-f9e7-4dfd-8ee2-f58d976b3b2a') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Scatter Chart</strong> (o <strong>gráfico de dispersión</strong> en español) es una versátil visualización integrada en Power BI que, como indica su nombre, permite crear gráficos de dispersión. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos.
En su versión más sencilla, basta con arrastrar sendos campos a los ejes X e Y (pueden ser tanto campos como medidas, y tanto campos cuantitativos como categóricos) y, si el campo llevado al eje X no es categórico, llevar un campo de nuestro modelo de datos al campo de detalles de la visualización. Por ejemplo, en la siguiente imagen se está mostrando las categorías de productos por ventas totales y margen medio:
Esta es la configuración de la visualización:
Es posible mostrar u ocultar las etiquetas en <em>Formato > Etiquetas de categoría</em>, donde también podremos especificar su color, tamaño, fuente y color de fondo. Podemos aplicar un color discreto a las burbujas en <em>Formato > Colores de datos</em>. Este color puede ser común a todas las burbujas o puede ser especificado para cada una de ellas:
Podemos añadir una dimensión adicional llevando un campo de nuestro modelo de datos al campo <em>Leyenda</em> de la visualización. Si éste campo es el mismo que hemos llevado al campo <em>Detalles</em> de la visualización, simplemente estaremos aplicando un color diferente a cada burbuja (y mostrando la leyenda asociada). Si, por el contrario, se trata de un nuevo campo, cada una de las burbujas originales se desagregará según esta nueva dimensión. Por ejemplo, en la siguiente imagen, tras inhabilitar los colores personalizados que habíamos aplicado (en <em>Formato > Colores de datos</em>) llevamos el campo <em>Gender</em> (con información sobre el sexo de los clientes) al mencionado campo <em>Leyenda</em>:
Podemos configurar las burbujas para que su tamaño sea proporcional al valor de otra métrica. Si, por ejemplo, llevamos la medida <em>Units</em> (que suma el número de unidades vendidas) al campo Tamaño de la visualización, ésta mostraría el siguiente aspecto:
Si, como en este caso, las burbujas son demasiado grandes para poder interactuar con ellas cómodamente, es posible aplicar un factor de aumento/reducción en <em>Formato > Formas > Tamaño</em>. Por defecto este valor es 0, aumentándolo estaremos aumentando también el tamaño de las burbujas. Disminuyéndolo, las haremos menores:
El resultado es el siguiente:
Si movemos el cursor encima de una de las burbujas se muestra una ventana flotante con la información asociada a la burbuja, tal y como cabría esperar:
Y aunque no lo hemos comentado, podemos arrastrar al campo <em>Detalles</em> más de un campo para formar una jerarquía, permitiéndonos la visualización navegar por ella. En la siguiente imagen se han llevado los campos <em>Category</em> y <em>Subcategory</em> (campos de nuestro modelo de datos) al campo <em>Detalles</em> y se ha bajado hasta el nivel de <em>Subcategory</em>. Obsérvense los típicos iconos de Power BI en la parte superior de la visualización permitiéndonos movernos por la jerarquía:
También podemos llevar a la visualización (al campo <em>Eje de reproducción</em>) un campo que sirva para "reproducir" los datos a lo largo de una nueva dimensión (típicamente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>. Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09_0.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca.
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
Es de destacar que cuando se configura la visualización con un eje de reproducción resulta muy lenta respondiendo a cambios en su configuración, tamaño, etc.
Y comentar para terminar un par de limitaciones de esta visualización: no es posible modificar la transparencia de las burbujas y, tal y como se puede ver en las anteriores imágenes, en ocasiones las burbujas quedan tan cerca del borde que no se muestran completas. Es posible configurar los límites a mostrar en ambos ejes, pero sería preferible que este ajuste fuese automático.
Buena visualización, en general, y muy configurable y versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-91beedb0-f9e7-4dfd-8ee2-f58d976b3b2a') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Scatter Chart</strong> (o <strong>gráfico de dispersión</strong> en español) es una versátil visualización integrada en Power BI que, como indica su nombre, permite crear gráficos de dispersión. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos.
En su versión más sencilla, basta con arrastrar sendos campos a los ejes X e Y (pueden ser tanto campos como medidas, y tanto campos cuantitativos como categóricos) y, si el campo llevado al eje X no es categórico, llevar un campo de nuestro modelo de datos al campo de detalles de la visualización. Por ejemplo, en la siguiente imagen se está mostrando las categorías de productos por ventas totales y margen medio:
Esta es la configuración de la visualización:
Es posible mostrar u ocultar las etiquetas en <em>Formato > Etiquetas de categoría</em>, donde también podremos especificar su color, tamaño, fuente y color de fondo. Podemos aplicar un color discreto a las burbujas en <em>Formato > Colores de datos</em>. Este color puede ser común a todas las burbujas o puede ser especificado para cada una de ellas:
Podemos añadir una dimensión adicional llevando un campo de nuestro modelo de datos al campo <em>Leyenda</em> de la visualización. Si éste campo es el mismo que hemos llevado al campo <em>Detalles</em> de la visualización, simplemente estaremos aplicando un color diferente a cada burbuja (y mostrando la leyenda asociada). Si, por el contrario, se trata de un nuevo campo, cada una de las burbujas originales se desagregará según esta nueva dimensión. Por ejemplo, en la siguiente imagen, tras inhabilitar los colores personalizados que habíamos aplicado (en <em>Formato > Colores de datos</em>) llevamos el campo <em>Gender</em> (con información sobre el sexo de los clientes) al mencionado campo <em>Leyenda</em>:
Podemos configurar las burbujas para que su tamaño sea proporcional al valor de otra métrica. Si, por ejemplo, llevamos la medida <em>Units</em> (que suma el número de unidades vendidas) al campo Tamaño de la visualización, ésta mostraría el siguiente aspecto:
Si, como en este caso, las burbujas son demasiado grandes para poder interactuar con ellas cómodamente, es posible aplicar un factor de aumento/reducción en <em>Formato > Formas > Tamaño</em>. Por defecto este valor es 0, aumentándolo estaremos aumentando también el tamaño de las burbujas. Disminuyéndolo, las haremos menores:
El resultado es el siguiente:
Si movemos el cursor encima de una de las burbujas se muestra una ventana flotante con la información asociada a la burbuja, tal y como cabría esperar:
Y aunque no lo hemos comentado, podemos arrastrar al campo <em>Detalles</em> más de un campo para formar una jerarquía, permitiéndonos la visualización navegar por ella. En la siguiente imagen se han llevado los campos <em>Category</em> y <em>Subcategory</em> (campos de nuestro modelo de datos) al campo <em>Detalles</em> y se ha bajado hasta el nivel de <em>Subcategory</em>. Obsérvense los típicos iconos de Power BI en la parte superior de la visualización permitiéndonos movernos por la jerarquía:
También podemos llevar a la visualización (al campo <em>Eje de reproducción</em>) un campo que sirva para "reproducir" los datos a lo largo de una nueva dimensión (típicamente será el tiempo). Si llevamos nuestro campo <em>Date</em> del calendario a este campo de la visualización, se muestra un eje de reproducción en la parte inferior. Un clic en el botón de "<em>Play</em>" de su izquierda animará la visualización mostrando el gráfico para cada uno de los días del período considerado. Un clic en un punto concreto de este eje de reproducción mostrará directamente el gráfico para dicho día (podemos pinchar y arrastrar la cabeza del reproductor a mano buscando el día que nos interese):
El campo <em>Date</em> que hemos llevado a este campo de la visualización ha adoptado, por defecto, el tipo <em>Date</em>. Si lo cambiamos a tipo <em>Jerarquía de fechas</em>, se incluye en la jerarquía solo el primer nivel (Año):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/bpi_scatter_chart_09_0.jpg"></a>
Ahora, el eje de reproducción muestra apenas períodos de un año. Al igual que antes, podemos hacer clic en el botón "<em>Play</em>" de reproducción, o saltar directamente a un año haciendo clic en su marca.
Probablemente por un error de programación no es posible movernos por los trimestres de los distintos años usando la jerarquía. Si deseamos hacer esto tendremos que crear en nuestro calendario un campo personalizado que incluya el año y número de trimestre, por ejemplo, usando este campo para configurar el eje de reproducción de la visualización.
Es de destacar que cuando se configura la visualización con un eje de reproducción resulta muy lenta respondiendo a cambios en su configuración, tamaño, etc.
Y comentar para terminar un par de limitaciones de esta visualización: no es posible modificar la transparencia de las burbujas y, tal y como se puede ver en las anteriores imágenes, en ocasiones las burbujas quedan tan cerca del borde que no se muestran completas. Es posible configurar los límites a mostrar en ambos ejes, pero sería preferible que este ajuste fuese automático.
Buena visualización, en general, y muy configurable y versátil.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '3bd8bb92-c2d3-4983-8e0e-8bc4022cb2f6') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '3bd8bb92-c2d3-4983-8e0e-8bc4022cb2f6') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('file_load_multiple') (Line: 696)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->buildQuery(Array) (Line: 422)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->getFromStorage(Array) (Line: 393)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->doLoadMultiple(Array) (Line: 346)
Drupal\Core\Entity\EntityStorageBase->loadMultiple(Array) (Line: 641)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '3bd8bb92-c2d3-4983-8e0e-8bc4022cb2f6') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '3bd8bb92-c2d3-4983-8e0e-8bc4022cb2f6') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '3bd8bb92-c2d3-4983-8e0e-8bc4022cb2f6') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'c8f5c4ae-442b-458f-9af8-3b54d5175733') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'c8f5c4ae-442b-458f-9af8-3b54d5175733') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('file_load_multiple') (Line: 696)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->buildQuery(Array) (Line: 422)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->getFromStorage(Array) (Line: 393)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->doLoadMultiple(Array) (Line: 346)
Drupal\Core\Entity\EntityStorageBase->loadMultiple(Array) (Line: 641)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'c8f5c4ae-442b-458f-9af8-3b54d5175733') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'c8f5c4ae-442b-458f-9af8-3b54d5175733') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'c8f5c4ae-442b-458f-9af8-3b54d5175733') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '1b944e72-aa10-4092-9e8f-30dba1aa5706') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '1b944e72-aa10-4092-9e8f-30dba1aa5706') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('file_load_multiple') (Line: 696)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->buildQuery(Array) (Line: 422)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->getFromStorage(Array) (Line: 393)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->doLoadMultiple(Array) (Line: 346)
Drupal\Core\Entity\EntityStorageBase->loadMultiple(Array) (Line: 641)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '1b944e72-aa10-4092-9e8f-30dba1aa5706') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '1b944e72-aa10-4092-9e8f-30dba1aa5706') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '1b944e72-aa10-4092-9e8f-30dba1aa5706') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '8f9ecbd0-cc9f-4f47-9f0e-f95e2f4b43ac') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '8f9ecbd0-cc9f-4f47-9f0e-f95e2f4b43ac') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('file_load_multiple') (Line: 696)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->buildQuery(Array) (Line: 422)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->getFromStorage(Array) (Line: 393)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->doLoadMultiple(Array) (Line: 346)
Drupal\Core\Entity\EntityStorageBase->loadMultiple(Array) (Line: 641)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '8f9ecbd0-cc9f-4f47-9f0e-f95e2f4b43ac') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '8f9ecbd0-cc9f-4f47-9f0e-f95e2f4b43ac') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '8f9ecbd0-cc9f-4f47-9f0e-f95e2f4b43ac') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'da590f8f-a413-49ed-8062-461742a8f9a3') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'da590f8f-a413-49ed-8062-461742a8f9a3') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('file_load_multiple') (Line: 696)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->buildQuery(Array) (Line: 422)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->getFromStorage(Array) (Line: 393)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->doLoadMultiple(Array) (Line: 346)
Drupal\Core\Entity\EntityStorageBase->loadMultiple(Array) (Line: 641)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'da590f8f-a413-49ed-8062-461742a8f9a3') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'da590f8f-a413-49ed-8062-461742a8f9a3') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'da590f8f-a413-49ed-8062-461742a8f9a3') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '8585059e-bb24-4930-9341-453661998d33') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '8585059e-bb24-4930-9341-453661998d33') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('file_load_multiple') (Line: 696)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->buildQuery(Array) (Line: 422)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->getFromStorage(Array) (Line: 393)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->doLoadMultiple(Array) (Line: 346)
Drupal\Core\Entity\EntityStorageBase->loadMultiple(Array) (Line: 641)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '8585059e-bb24-4930-9341-453661998d33') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '8585059e-bb24-4930-9341-453661998d33') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '8585059e-bb24-4930-9341-453661998d33') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '66f64f25-8585-4075-a857-fb7fd0f20176') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '66f64f25-8585-4075-a857-fb7fd0f20176') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('file_load_multiple') (Line: 696)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->buildQuery(Array) (Line: 422)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->getFromStorage(Array) (Line: 393)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->doLoadMultiple(Array) (Line: 346)
Drupal\Core\Entity\EntityStorageBase->loadMultiple(Array) (Line: 641)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '66f64f25-8585-4075-a857-fb7fd0f20176') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '66f64f25-8585-4075-a857-fb7fd0f20176') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '66f64f25-8585-4075-a857-fb7fd0f20176') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'c056598d-3108-4264-814d-2728e43bebbb') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'c056598d-3108-4264-814d-2728e43bebbb') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('file_load_multiple') (Line: 696)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->buildQuery(Array) (Line: 422)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->getFromStorage(Array) (Line: 393)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->doLoadMultiple(Array) (Line: 346)
Drupal\Core\Entity\EntityStorageBase->loadMultiple(Array) (Line: 641)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'c056598d-3108-4264-814d-2728e43bebbb') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'c056598d-3108-4264-814d-2728e43bebbb') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'c056598d-3108-4264-814d-2728e43bebbb') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'eb08a528-773e-4a35-a991-04fcd9e88809') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'eb08a528-773e-4a35-a991-04fcd9e88809') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('file_load_multiple') (Line: 696)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->buildQuery(Array) (Line: 422)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->getFromStorage(Array) (Line: 393)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->doLoadMultiple(Array) (Line: 346)
Drupal\Core\Entity\EntityStorageBase->loadMultiple(Array) (Line: 641)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'eb08a528-773e-4a35-a991-04fcd9e88809') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'eb08a528-773e-4a35-a991-04fcd9e88809') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'eb08a528-773e-4a35-a991-04fcd9e88809') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'b332d446-34ef-4505-8036-5154853b7af3') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'b332d446-34ef-4505-8036-5154853b7af3') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('file_load_multiple') (Line: 696)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->buildQuery(Array) (Line: 422)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->getFromStorage(Array) (Line: 393)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->doLoadMultiple(Array) (Line: 346)
Drupal\Core\Entity\EntityStorageBase->loadMultiple(Array) (Line: 641)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'b332d446-34ef-4505-8036-5154853b7af3') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'b332d446-34ef-4505-8036-5154853b7af3') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'b332d446-34ef-4505-8036-5154853b7af3') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '536cb58e-e441-47d8-8340-194286bb245b') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '536cb58e-e441-47d8-8340-194286bb245b') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('file_load_multiple') (Line: 696)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->buildQuery(Array) (Line: 422)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->getFromStorage(Array) (Line: 393)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->doLoadMultiple(Array) (Line: 346)
Drupal\Core\Entity\EntityStorageBase->loadMultiple(Array) (Line: 641)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '536cb58e-e441-47d8-8340-194286bb245b') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '536cb58e-e441-47d8-8340-194286bb245b') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '536cb58e-e441-47d8-8340-194286bb245b') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '35427fe6-deb6-4e96-a4e8-500e5e1a46db') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '35427fe6-deb6-4e96-a4e8-500e5e1a46db') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('file_load_multiple') (Line: 696)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->buildQuery(Array) (Line: 422)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->getFromStorage(Array) (Line: 393)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->doLoadMultiple(Array) (Line: 346)
Drupal\Core\Entity\EntityStorageBase->loadMultiple(Array) (Line: 641)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '35427fe6-deb6-4e96-a4e8-500e5e1a46db') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '35427fe6-deb6-4e96-a4e8-500e5e1a46db') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '35427fe6-deb6-4e96-a4e8-500e5e1a46db') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'c599aec3-b047-4878-a643-b5b29b65bec1') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'c599aec3-b047-4878-a643-b5b29b65bec1') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('file_load_multiple') (Line: 696)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->buildQuery(Array) (Line: 422)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->getFromStorage(Array) (Line: 393)
Drupal\Core\Entity\Sql\SqlContentEntityStorage->doLoadMultiple(Array) (Line: 346)
Drupal\Core\Entity\EntityStorageBase->loadMultiple(Array) (Line: 641)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'c599aec3-b047-4878-a643-b5b29b65bec1') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'c599aec3-b047-4878-a643-b5b29b65bec1') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'c599aec3-b047-4878-a643-b5b29b65bec1') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente:
Campos relativos a items:
<ul><li>Item (required)</li>
<li>Item Type</li>
<li>Item Attributes (up to 10)</li>
<li>Item Filter Key</li>
</ul>Campos relativos a linked items:
<ul><li>Item Linker (object format)</li>
<li>Linked Item (edge format)</li>
<li>Linked Item Type (edge format)</li>
<li>Link Weight (edge format)</li>
<li>Linked Item Filter Key (edge format)</li>
</ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge".
Items
Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer:
El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo).
Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata":
Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial.
Item Type
Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto:
De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona.
Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres.
Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece:
En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto":
Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado:
Item Attributes
Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10).
Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen:
Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada).
La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente.
La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€.
La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar.
En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca.
Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno.
Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>.
Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo).
Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes:
La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo.
Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización.
Linked Items
Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder.
Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados.
Así que comencemos por lo que parece ser la opción más simple, el formato de objeto.
Item Linker (object format)
Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente:
Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-).
Linked Item (edge format)
Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>".
También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido):
En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente.
Linked Item Type (edge format)
Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente:
Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría.
Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión:
Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido.
Filters
Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado).
Resumen
En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
include('/var/www/vhosts/interactivechaos.ovh/httpdocs/modules/contrib/google_analytics/src/Component/Render/GoogleAnalyticsJavaScriptSnippet.php') (Line: 578)
Composer\Autoload\ClassLoader::Composer\Autoload\{closure}('/var/www/vhosts/interactivechaos.ovh/httpdocs/modules/contrib/google_analytics/src/Component/Render/GoogleAnalyticsJavaScriptSnippet.php') (Line: 432)
Composer\Autoload\ClassLoader->loadClass('Drupal\google_analytics\Component\Render\GoogleAnalyticsJavaScriptSnippet') (Line: 372)
google_analytics_page_attachments(Array) (Line: 313)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}(Object, 'google_analytics') (Line: 405)
Drupal\Core\Extension\ModuleHandler->invokeAllWith('page_attachments', Object) (Line: 310)
Drupal\Core\Render\MainContent\HtmlRenderer->invokePageAttachmentHooks(Array) (Line: 288)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\user\Entity\Role::postLoad(Object, Array) (Line: 423)
Drupal\Core\Entity\EntityStorageBase->postLoad(Array) (Line: 353)
Drupal\Core\Entity\EntityStorageBase->loadMultiple() (Line: 126)
eu_cookie_compliance_page_attachments(Array) (Line: 313)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}(Object, 'eu_cookie_compliance') (Line: 405)
Drupal\Core\Extension\ModuleHandler->invokeAllWith('page_attachments', Object) (Line: 310)
Drupal\Core\Render\MainContent\HtmlRenderer->invokePageAttachmentHooks(Array) (Line: 288)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
El scatter chart o gráfico de dispersión es una visualización integrada en Power BI. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos:
Esta visualización de Microsoft, Sunburst, nos permite visualizar una métrica asociada a datos jerárquicos, mostrándose esta información en círculos concéntricos que representan cada uno de los niveles de la jerarquía. La configuración de esta visualización es muy sencilla:
Esta visualización permite mostrar una red de elementos relacionados, ofreciendo una buena cantidad de herramientas para configurar los enlaces que la forman. El panel de configuración es el siguiente:
Cluster Map muestra información -supuestamente agrupada en clusters según algún criterio- en forma de nube de imágenes. Su configuración es la mostrada en la siguiente imagen:
La visualización Multi KPI de Microsoft permite presentar un KPI (indicador clave de rendimiento) junto a información adicional que puede resultar de interés.
Una vez instanciada en nuestro lienzo, podemos ver qué campos definen su configuración:
Pulse Chart es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
El Scatter Chart (o gráfico de dispersión en español) es una versátil visualización integrada en Power BI que, como indica su nombre, permite crear gráficos de dispersión. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos.
El Pivot Slicer es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
El Text Filter ofrece una herramienta de búsqueda que puede ser utilizada para filtrar otras visualizaciones de nuestros informes, funcionalidad básica que, sin embargo, no está disponible más que usando los filtros estándar de Power BI, menos cómodos.
En el siguiente ejemplo se ha asociado al Text Filter el campo Full Name que contiene el nombre completo de nuestros clientes, y se muestra debajo una tabla con datos de éstos, incluyendo su nombre:
La visualización Card Browser de Microsoft permite visualizar de forma elegante información (no solo textual) con una o dos imágenes asociadas. En la siguiente captura de pantalla, por ejemplo, se muestra información sobre los clientes de la empresa:

Obsérvese la configuración de la visualización:
Excepto donde se indique otra cosa, los contenidos de este sitio web se ofrecen bajo una licencia Reconocimiento-NoComercial-SinObraDerivada 4.0 Internacional